C++关于ostream的疑问

#include<iostream>#include<fstream>usingnamespacestd;classA{private:ostream*f;//把*删去p... #include <iostream>
#include <fstream>
using namespace std;
class A{
private:
ostream * f; //把*删去
public:
A(){ f = &cout; } //把&删去
A(ostream* t) :f(t){}
void print(){
*f << "msg"; //把*删去 }
};

void main(){
A a;
a.print();
}

这一段程序放在vs2013中能成功输出,但如果按照注释里的方法不用指针,就会编译错误:无法引用"="(f=cout中),它是已删除的函数。求教这是怎么回事?
展开
 我来答
帐号已注销
推荐于2016-03-28 · TA获得超过3954个赞
知道大有可为答主
回答量:1636
采纳率:77%
帮助的人:1218万
展开全部

原因是:流对象是不可以拷贝的。 你把* &删除之后,f = cout; 就是一个复制语句,是非法的。


在以前版本的VC++中,流类的复制操作和复制构造函数被声明为Private,所以外部代码是无法调用的,也就实现了防止复制的效果。


而你用的Visual Studio 2013扩展了delete语法(C++11)用于删除函数,这种扩展可以使得某个函数无法被调用。


下图是Visual studio 2015 ostream.h文件中截取的代码片段:

红色框包围的就是ostream类模版的复制构造函数。注意:ostream类实际上是basic_ostream类模板的一个实例。


通过观察可以发现:即使拷贝构造函数的访问控制修饰是public,但是由于后面添加了 = delete; 使得该函数无法被调用,所以你的代码就提示 "它是已删除的函数"。


ostream流类没有默认构造函数,所以删除* &之后你的代码还有一个错误。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式