C++之运算符重载
C++运算符重载(overloading)
1.问题需求
为了根据自己的需要对C++已提供的运算符进行重载,赋予他们新的含义,使之一名多用。
2.运算符重载
运算符重载的方法是定义一个重载运算符的函数,使指定的运算符不仅能实现原有的功能,而且能实现在函数中指定的新的功能。在使用被重载的运算符时,系统就会自动调用该函数,以实现相应的功能。
运算符重载实质上就是函数重载。
运算符重载的格式:
返回值类型 operator运算符名称(形参表){重载处理};
注意:
函数名是由operator和运算符组成的
eg:
Complex operator+(const Complex &a);
如何调用重载运算符:
对象1 运算符 对象2 eg:a+b
编译器如何区分时运算符重载还是运算符的基本功能:
编译器需要检查表达式的上下文,看运算符两侧数据的数据类型,来决定是否重载
3.重载运算符的规则
1.c++不允许用户自己定义新的运算符,只能对已有的运算符进行重载。
2.c++中不允许重载的运算符
. 成员访问运算符 * 成员指针访问运算符 :: 域运算符 sizeof 长度运算符 ?: 条件运算符 "."和"*"不能重载是为了保证访问成员的功能不能被改变
"::"和"sizeof"运算符的运算对象是类型而不是变量或一般表达式,不具备重载的特征。
3.重载不能改变运算符运算对象(即操作数)的个数。4.重载不能改变运算符的优先级别。
5.重载不能改变运算符的结合性。
6.重载运算符的函数不能带有默认的参数
7.重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或对类对象的引用) --- 参数不能全是C++的标准类型
这样做是为了防止修改C++标准类型的运算符。
8.用于类对象的运算符一般必须重载,但有两个例外,运算符"=''和"&"不必用户重载。
1."="运算符被编译器用于对象复制的重载 2."&"运算符也不需要重载,他被重载为返回类对象在内存中的起始地址。
4.运算符重载函数的处理方式 【重点】
1.放在类中做成员函数
2.运算符重载的函数不是类的成员函数(可以是一个普通函数),在类中把他声明为友元函数。--- 友元重载运算函数
友元函数和成员函数重载运算符的区别 -- 但必须得有一个对象参数
1.友元函数参数个数就是运算符的操作数的个数,
2.成员函数重载运算符要少一个操作数,本类对象占用一个操作数
5.运算符重载的特别注意事项【重点规范】
5.1 究竟把运算符重载函数作为类的成员函数好,还是友元函数好?
1.C++规定,=,[],(),->必须作为成员函数
2.流插入<<和流提取运算符>>、类型转换运算符不能定义为类的成员函数,只能作为友元函数
3.一般将单目运算符和复合运算符重载为成员函数
4.一般将双目运算符重载为友元函数
5.2 例题:声明一个字符串类String,用来存放不定长的字符串,重载运算符"==","<",">",使他们能用于两个字符串的等于、小于和大于的比较运算 -- 重载双目运算符
tips:双目运算符一般使用友元函数重载运算符
5.3 有一个Time类,包含数据成员minute(分)和sec(秒),模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0起算。要求输出分和秒的值 --- 重载单目运算符
tips:单目运算符一般使用成员函数重载运算符
6.特殊的重载运算符
6.1 ++,--运算符重载
因为++,--分别有两种使用方法,所以要考虑前置,还是后置的问题
关键问题:如何区分是前置自增还是后置自增?
在自增(自减)运算符重载函数中,增加一个int型参数,用来标记后置自增(自减)运算符重载,区分前置自增(自减).
前置自增运算符重载:
返回值类型 operator++();
后置自增运算符重载:
返回值类型 operator++(int); // 注意后置单目运算,操作方法,一般是先复制一个对象,在修改调用对象,返回复制的对象
6.2 重载流插入运算符和流提取运算符
c++中的cin和cout分别是istream和ostream流的对象,<<和>>在系统中进行了重载
"<<"重载函数格式
ostream& operator<<(ostream &,自定义类&)
">>"重载函数格式
istream& operator>>(istream&,自定义类&)
调用方法:
流对象<<(>>)自定义类对象;
注意:
1.重载运算符"<<"的函数的第一个参数和函数的返回类型都必须是ostream&类型对象的引用
2.重载运算符">>"的函数的第一个参数和函数的返回类型都必须是istream&类型对象的引用
3.ostream&一般传入的参数是cout,istream一般传入的参数为cin,然后就可以在重载函数里面使用cin和cout进行输出和输入了,只不过是指向cin和cout对象的名字变了一下而已
4.return 流对象 的作用是
能连续向流中输出和输入数据。