运算符重载
operator+,operator和+之间没有空格,两者构成了函数名
可以①内部函数重载②外部函数重载,隐式调用(eg:a+b)两者不能同时存在,会出现二义性
显式调用,eg:operator+(a,b)、a.operator(b)
实参中两对象的相对位置,与形参中两者的相对位置相同
可以连加、连减,但会产生匿名对象。eg:c4=c1-c2-c3。c1-c2产生一个匿名对象1,匿名对象1-c3又产生了一个匿名对象2
产生C++匿名对象(临时对象)的三种情况:
1.函数形参的值传递(而不是引用传递)
2.类型转换。
eg1:Person p;
p=18; //两者类型不同,以18为参调用构造函数创建了临时对象,再赋值
eg2:Person p=18; //Person p,为p对象创建了空间,调用构造函数是在此空间内进行的
3.函数需要返回一个对象
运算符重载规则:
1.只能重载C++已有的操作符
2.C++允许重载的运算符(C++中绝大部分运算符都可以)
仅4个不能重载
其中".*",a.*p等价于*(a.p),实际上没人使用,因为不好理解,不如直接用后者的形式去写
class A{
char* p;
};
第4个是三目运算符
3.重载不能改变运算符操作数的个数
单目运算符1个操作数,双目运算符2个操作数,三目运算符3个操作数
4.运算符优先级不变
5.运算符结合方向不变
6.重载操作符函数,不能有默认参数。
若有默认参数则违背了第3点,有了默认参数2个操作数可以只传1个,而第3点要求,2个操作数的运算符必须传2个参数
7.重载运算符中必须和用户自定义类型对象一起使用,其参数中至少应有一个是类对象或类对象的引用
8."="和"&"不必重载
"=",可使同类对象相互赋值
注:可以重载"="的深拷贝
"&",返回类对象在内存中的起始地址
9.应使重载后的运算符与原始的含义相同
10.运算符重载函数可以是类的成员函数、类的友元函数、全局函数
=========================================================================
双目运算符、单目运算符
++a,可以连加
++++a
a++,不可以连加,会报错
a++++ //err-表达式必须是可修改的左值
故a++,返回的是一个常量
重载后++时,
其返回值类型为const Complex operator++(Complex& c,int) {},返回的是const类型的匿名对象(因为没加引用型)
因为要创建一新对象在复制后用于返回,以及对引用型参数++,故此时不能返回引用型,因为局部变量,在operator++函数调用结束后会被销毁
使用占位符参数int(亚元,用于填坑),重载后++,以和前++的形参列表产生区别
左移、右移运算符重载
cout是ostream类型的对象
cin是istream类型的对象
<<与>>的结合方向是从左到右
cout<
cout<<
cout<< cout< cout; 即不断返回ostream& os的类型ostream& 等价于operator<<(cout,c); 左移运算符,只能写在全局处,不能写在成员中,否则调用的顺序会变反(eg:c<



