搜索

首页  >  问答  >  正文

c++关于引用做形参不初始化和ostream类的问题

void fun(ostream &os)  //可以

main中,
ostream &os  //不可以,为什么?
ostream os  //不可以,为什么


大家讲道理大家讲道理2970 天前929

全部回复(2)我来回复

  • 代言

    代言2016-11-11 14:05:22

    ostream &os //不可以,为什么。
    当然不可以,引用不能为空,必须初始化。
    ostream &os = std:cout;
    就可以。
    ostream os //不可以,为什么。
    因为ostream设计上是一个基类,它抽象了底层的行为,它本身什么功能都没有,当然不允许构造实例。
    ostream *os = new ofstream();
    作为基类指针完全可以。

    void fun(ostream &os) //可以
    你这么写的话,就要求调用fun的时候必须传入一个有效的引用。
    比如fun(std::cout),否则编译器还是会报错。


    回复
    0
  • 代言

    代言2016-11-11 14:05:06

    当使用pass-by-value进行函数调用时会对参数进行拷贝初始化,而C++系统由于避免IO资源冲突或内存泄露问题从而规定了IO对象无法进行拷贝。

    在STL中iostream的拷贝构造函数被设置为delete(C++11),旧版本中将其拷贝构造函数和拷贝赋值操作符声明为private且无定义来阻止拷贝。(此处可参见《Effective C++》条款06)

    所以将iostream作为参数进行传递时需使用pass-by-reference而非pass-by-value。


    回复
    0
  • 取消回复