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的。
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的。
相关文章推荐
- C++运算符优先级
- C++ Primer 学习笔记_10_数组
- C++里类中定义对象与定义局部变量的问题
- Java和C++中的重载,覆盖,隐藏区别
- C++标准转换运算符reinterpret_cast
- C++标准转换运算符reinterpret_cast
- C语言的编程机制
- 码农的取经之路,c++是个什么鬼?
- 最新CC++函数与算法速查大辞典 中国铁道出版社 上线了请大家关注,多提宝贵意见
- c语言中realloc()函数解析
- 2015,C/C++开发工程师生存现状调查
- C语言 全局变量和局部变量的大小限制
- C++的王牌通信框架--ACE在windows下的搭建
- C语言中的转义字符
- 第9周项目1 猴子选大王(数组版)
- 编程免费书Python,C/C++
- 第8周项目5 计数的模式匹配
- C/C++高阶语法:函数指针引用,引用与指针
- C++和java多态的区别
- C语言泛型初探----C链表