C++中的I/O流笔记

  1. 字节流可以是任何在内存存储的信息。
  2. cin是类istream的对象,cout是类ostream的对象
  3. '>>‘和’<<'能自动识别输入输出类型。
  4. 重载插入和抽取运算符的重载只能用友元函数形式重载,因为这些对象不是自定义的。
  5. 重载函数格式:
  • ‘<<’的形式:
ostream& operator <<(ostream& stream, const 类名 &obj){
    
    
	return stream;
}
//设这里有个Complex复数对象,要重载输出运算符
friend ostream& operator <<(ostream& stream, const Complex& obj){
    
    
//在这里已经是重载,传入的对象是stream,不再是cout,cout也只是一个对象而已。但也不是不能使用,只是这样写能更加灵活,满足多种输出类型的需求
	stream << obj.real << obj.image;
	return stream;
}
  • '>>'的格式
istream& operator >>(istream& stream, 类名 &obj){
    
    
	return stream;
}
//设这里有个Complex复数对象,要重载输入运算符
friend istream& operator >>(istream& stream, Complex& obj){
    
    
//如果想在这里输出提示,就不是stream对象了,因为它是istream对象,这里用cout就好
	cout << "please input the real and the image" << endl;
	stream >> obj.real;
	stream >> obj.image;
	return stream;
}
  • 注意:
    (1)在重载函数内部并不是不能使用cin和cout对象,要根据具体情况和程序员的需求来使用。
    (2)函数返回值为流的引用能支持连续的输入输出。
Complex obj1, obj2;
cin >> obj1 >> obj2;
cout << obj1 << endl << obj2 << endl;
  1. 格式化成员函数
  • 调用形式
int a = 1234;
cout.width(8);
cout << a;
  • 注意:有些函数一旦调用后面就一直生效,但有些只生效一次。
  1. ios类的操纵符
  • 不带参数的操纵符在iostream.h的头文件中,带参数的在iomanip.h中。
  • 使用方式
double a = 3.1415;
cout << setprecision(2) << a;
  • 操纵符的生效次数也与格式化函数相似。
  1. get / getline(char*, stringlength, 分隔符)
  • get的分割符不会插入数组,但会留在缓冲流中,若接下来还有字符输入就会接受到分隔符。而getline会直接丢掉分隔符,不会出现这种情况。
  1. 重载输出运算符时,如果后面不是单纯的类,而是类运算,在重载时参数类型不能是引用。
cout << obj1 + obj2 << endl;

// 这种写法运行错误
ostream& operator <<(ostream&, className&)

// 这种写法是正确的
ostream& operator <<(ostream&, className)

猜你喜欢

转载自blog.csdn.net/weixin_45688536/article/details/106825124