您的位置:首页 > 编程语言 > C语言/C++

C++IO对象不可复制或赋值

2015-11-06 11:10 267 查看
IO类型的3个独立的头文件:

iostream定义读写控制窗口的类型,

fstream 定义读写已命名文件的类型,             (包含fstream类)

sstream定义读写存储在内存中的string对象。(包含了stringstream类)

IO类型不可复制或赋值

因此,IO类型不可存储在vector容器中。(IO是流对象,而流对象是不能复制的,所以不能存储在vector容器中)

在编写程序时,有时会遇到下面所示的一个问题,贴出来,希望对大家有所帮助。

例如:

#include <iostream>

#include <fstream>

using namespace std;

void fun(ofstream ofile)

{

     ofile<<"opq rst"<<endl;

}

int main()

{

     ofstream outfile;

     outfile.open("1.txt", ios::app);

     outfile<<"abcdefg hijklmn"<<endl;

     fun(outfile);

     outfile.close();

     return 0;

}

对于这段程序我们会发现,编译是没有问题的,但是运行时会出现“应用程序错误,该内存不能为read”的错误提示。当我们把函数void fun(ofstream ofile)改为void fun(ofstream &ofile)。即我们传递一个指向ofstream对象outfile的引用过去后,发现错误解决了。

    这种错误一般是由于访问了不该访问的内存而导致的,并且通常都是在使用指针时才会出现。但是,在这个地方究竟是怎么回事呢?经过查阅资料发现,是由于在C++中,IO对象不可复制或赋值所导致的。

IO类型的3个独立的头文件:

    iostream定义读写控制窗口的类型

    fstream 定义读写已命名文件的类型

    sstream定义读写存储在内存中的string对象

    因此,IO类型不可存储在vector容器中。(IO是流对象,而流对象是不能复制的,所以不能存储在vector容器中)

ofstream out1,out2;

out2 = out1; //error : cannot assign stream objects

ofstream print(ofstream);

out2 = print(out2); //error:cannot copy stream objects

形参或返回类型也不能为流类型。如果要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用。

ofstream &print(ofstream&); //ok:takes a reference,no copy

while(print(out2)) { ... }          // ok:pass reference to out2

一般,如果要传递IO对象以便对它进行读写,可用非const引用的方式传递这个流对象。对IO对象的读写会改变它的状态,因此引用必须是非const的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: