C++程序设计第九章

第九章 运算符重载及刘类库

**大家想一起学习交流的可以加群,QQ:755422568。**

一、运算符重载(就是函数重载)

(1)、重载对象的赋值运算符

保持原有的运算符个数、优先级和结合性不变

str(char *s)
str& operator = (char *s)

str :: str(char * s){	
}
str& str :: operator = (char * s){
}
(2)、运算符重载的实质

类运算符:作为类的成员函数的重载运算符
友元运算符:作为类的友元重载运算符
不能重载的运算符:. 、:: 、* 、?: 。
= 、() 、[ ] 、-> 只能用类运算符来重载。

(3)、<<、>>和++运算符重载实例

插入符函数的一般形式如下:

ostream& operator<<(ostream& output,类名& 对象名){
    //函数体
    return output;
    //output是类ostream对象的引用,它是cout的别名,即ostream& output = cout
}

提取符函数的一般形式如下:

istream& operator >>(istream& input,类名& 类对象){
    //函数体
    return input;
    //input是类istream对象的引用,它是cin的别名,即istream& input = cin
}
(4)、类运算符和友元运算符的区别

如果运算符所需的操作数(尤其是第一个操作数)希望进行隐式的类型转换,则运算符应通过友元来重载;如果一个运算符的操作需要修改类对象的状态,则应当使用类运算符,这样更符合数据封装的要求。但参数是使用引用还是对象,则要根据运算符在使用中的情况来定。
如果对象作为重载运算符函数的参数,则可以使用构造函数将常量转化为该类型的对象;如果使用引用作为参数,因为这些常量不能作为对象名使用,所以编译系统就会报错。再使用时,一定分清楚场合及使用方法。

成员运算符比友元运算符少一个参数,这是因为成员运算符具有this指针。

friend complex operator+(complex,complex);
friend complex operator+(complex&,complex&);
complex operator+(complex a,complex b){
	//其他代码
	return complex(r,i)
}
complex operator+(complex& a,complex& b){
	//其他代码
	return complex(r,i)
}
(5)、下标运算符“[]”的重载
iArray(int);
int& operator'[' ']'(int);

int&iArray :: operator'[' ']'(int i){
}

二、流类库

(1)、流类库的基础类

C++的流类库预定义了4个流,它们是cin、cout、cerr和clog,可以将cin视作类istream的一个对象,而将cout视为ostream的一个对象。

流是一个抽象概念,当实际进行I/O操作时,必须将流和一种具体的物理设备联接起来。

C++的流类库预定义的4个流所联接的具体设备为:

cin 与标准输入设备相联接
cout 与标准输出设备相联接
cerr 与标准错误输出设备相联接(非缓冲方式)
clog 与标准错误输出设备相联接(缓冲方式)
(2)、默认输入输出格式控制

字符的读入规则,对单字符来讲,它将舍去空格,直到读到字符为止。
对字符串来说,它从读到第一个字符开始,到空格符结束。对于字符数组,使用数组名来整体读入。
对于布尔型的值,如果输入为0则是false,否则均为true。输出的时候则只有0和1两个值。

三、文件流

在C++里,文件是通过流来完成的,C++有输入文件流(ifstream)、输出文件流(ofstream)和输入输出文件流(fstream)三种,并已经将它们进行标准化。

(1)、使用文件流
#include <fstream>
void example10();
int main() {
	example10();
	return 0;
}
 
void example10(){
	const int size = 10;
	char ch[size];
	char *p = "hello";
	ofstream out;					//建立文件输出流
	out.open("test.txt");			//打开一个测试的文件
	out << p;
	out << "world";
	out.close();					//关闭输出流
 
	ifstream in("test.txt");		//建立文件流
	for(int i=0;i<size+1;i++){		//循环输入字符
		in >> ch[i];
	}
	ch[size] = '\0';				//将最后一个字符置为结束符
	in.close();						//关闭输入流
	cout << ch;//helloworld
}
(2)、典型流成员函数

1)、 输出流的open函数
它有3个参数,第1个是要打开的文件名,第2个是文件的打开方式,第3个是文件的保护方式,一般都使用默认值。第2个参数可以取如下的值:

ios_base::in 打开文件进行读操作,可避免删除现存文件的内容
ios_base::out 打开文件进行写操作,这是默认模式
ios_base::ate 打开一个已有的输入或输出文件并查找到文件尾
ios_base::app 打开文件以便在文件的尾部添加数据
ios_base::binary 指定文件以二进制方式进行打开,默认为文本方式
ios_base::trunc 如文件存在,将其长度截断为0并清除原有内容

以上的几个参数,除app外,在其他几种方式下,文件刚打开时,指示当前读写位置的文件指针都定位于文件的开始位置;而app使用文件当前的写指针位于文件末尾。这几种方式也可通过“或”运算符“|”同时使用。

2)、输入流的open函数
可以使用默认构造函数建立对象,然后调用open成员函数打开,示例如下:

ifstream in;
in.open("filename",iosmode);
        或者使用参数构造函数指定文件名和打开模式,示例如下:

ifstream in("filename",iosmode);
         还可以使用指针,示例如下:

ifstream *in;
in->open("filename",isomode);
        其中,输入流的打开模式如下:

ios_base::in	打开文件用于输入,默认模式
ios_base::binary	指定文件以二进制方式打开,默认为文本方式

3)、 close成员函数
close成员函数用来关闭与一个文件流相关联的磁盘文件,如果没有关闭该文件,因为文件流是对象,所以在文件流对象的生存期结束时,将自动关闭该文件。不过,应养成及时关闭文件的习惯。

4)、错误处理函数
在对一个流对象进行I/O操作时,可能会产生错误,当错误发生时,可以使用文件流的错误处理成员函数进行错误类型判别。成员函数及其功能如下:

bad() 如果进行非法操作,返回true,否则返回false
clear() 设置内部错误状态,如果用缺省参量调用则清除所有错误位
eof() 如果提取操作已经到达文件尾,则返回true,否则返回false
good() 如果没有错误条件和没有设置文件结束标志,返回true,否则返回false
fail() 与good相反,操作失败返回false,否则返回true
is_open() 判定流对象是否成功的与文件关联,如果是返回true,否则返回false
发布了31 篇原创文章 · 获赞 4 · 访问量 1511

猜你喜欢

转载自blog.csdn.net/qq_38471554/article/details/101977285