重载操作符:
1、结合性以及优先性不变
2、操作个数不变
3、操作数类型规定:参数和返回类型可以重新说明,既可以重载,重载形式为:
返回类型 operator 运算符(参数说明)
c++规定,运算符中参数说明都是内部类型,不能重载,如
int * operator +(int ,int *)//error
//既不允许
//int a=5;
//int *pa=&a;
//pa=a*pa;
4、不能重载的运算符
点操作符(.) 域操作符(::) 成员间访操作符(.*) 成员指针操作符(->*) 条件操作符(?:)
值返回与引用返回
c++规定:=赋值运算符、()函数调用运算符、[]下标运算符、->通过指针访问类成员的运算符必须为成员函数形式
重载增量运算符:在定义上,放上一个整数形参,就是后增量预算符(a++)
前增量运算符返回引用,后增量运算符返回值
#include<iostream>
using namespace std;
//---------------------
class Increase{
public:
Increase(int x):value(x){}
Increase& operator++(); //前增量
Increase operator++(int); //后增量
void display(){ cout<<"the value is "<<value<<endl; }
private:
int value;
};//-------------------
Increase & Increase::operator++(){
value++; //先增量
return *this; //再返回原对象
}//--------------------
Increase Increase::operator++(int){
Increase temp(*this); //临时对象存放原有对象值
value++; //原有对象增量修改
return temp; //返回原有对象值
}//--------------------
int main(){
Increase n(20);
n.display();
(n++).display(); //显示临时对象值
n.display(); //显示原有对象
++n;
n.display();
++(++n);
n.display();
(n++)++; //第二次增量操作对临时对象进行
n.display();
}//--------------------
the value is 20
the value is 20
the value is 21
the value is 22
the value is 24
the value is 25
那么最重要的问题来了,我们什么时候声明为成员函数,什么时候声明为非成员函数呢?
首先,我们要明白这句话:对于成员函数来说,一个操作数通过this指针隐式的传递,(即本身),另一个操作数作为函数的参数显示的传递;对于友元函数(非成员函数)两个操作数都是通过参数来传递的。
(1)一般来说,单目运算符重载为类的成员函数,双目运算符重载为类的友元函数(咳咳,一般情况下)
(2)双目运算符不能将 = ()【】 -> 重载为类的友元函数。
(3)如果运算符的第一次操作数要求为隐式转换则必须为友元函数。
(4)当最左边的要求为类对象,而右边的是一个内置类型,则要为友元函数。
最重要的注意点:
T1 = T2 + T3;
可以为T1 = T2.operator+(T3);
也可以为T1 = operator+(T2,T3);
但是这两种方式不能同时声明定义,因为这会出现二义性。造成程序不知道该执行那个函数。在进行运算符重载的时候千万要注意造成二义性的情况。