个人的读书笔记,记录一下~
C
运算符重载
1方法
函数类型 operator 运算符名称(){}
- 重载后
c1+c2
被解释为c1.operator(c2)
2规则
- 不允许定义新的运算符
. * :: sizeof ?:
不允许重载- 重载运算符参数至少有一个是类对象
- 其他规则见p287
3运算符重载函数的处理方式
3.1作为类的成员函数
-
重载后
c1+c2
被解释为c1.operator+(c2)
。双目运算符,形参表中只有一个参数,因为this指向的对象是另一个。 -
类成员表达式的左边一定要是对象。
√
c3=c2+i
×
c3=i+c2
3.2在类中声明为友元函数
operator+(c1,c2)
- 双目运算符做友元函数,形参表中一定要有两个参数,不能省略
4重载双目运算符
5重载单目运算符
🐖:++前置后置不同,区分:在后置的形参中增加一个int形参,在声明和定义中都可以省略形参名,只保留int
6重载流运算符
istream& operator>>(istream &,自定义类&);
//isream类对象的引用
ostream& operator<<(ostream &,自定义类&);
🐖:只能被声明为友元函数,而不能声明为成员函数,且两个形参的位置不能替换,还有istream使用引用,这些都是因为要实现连续输出/入,类在操作符右端才能连续操作。
🐖:同时,运算符函数重载为成员函数,他的第一个参数必须是本类的对象,交换律不适用。故,一般情况下,双目运算符重载为友元,单目运算符重载为成员函数。
🐖:cout<<mystring
被解释为 operator<<(cout,mystring)
7不同类型数据的转换
7.1使用转换构造函数:其他类型->类
Complex(double r){}
🐖:只有一个参数
7.2类型转换函数:类->其他类型
- 只能作为类内成员函数
- 形式:
operator 类型名(){}
。没有返回类型,转换的其他类型和函数名称一致。 - 使用的时候直接
类+double
,编译系统会自动识别。 - 注意转换构造函数和类型转换函数同时使用的时候,会出现二义性。