前言
这节主要讲解了赋值运算符重载和取地址运算符重载
赋值运算符重载
- 当运算符被用于类类型的对象时,c++允许我们通过运算符重载的形式赋予新的定义。类类型对象使用运算符时,必须转换成调用对应运算符重载。
- 运算符重载是具有特殊名字的的函数,它的名字由operator和后面需要重载的运算符组成。
- 重载运算符函数的参数个数与该运算符的运算对象个数一样多。
- 如果一个重载运算符函数是成员函数,那么函数的第一个运算对象默认传给隐式的this指针,因此,运算符作为成员函数时,参数比运算对象少一个。
- 运算符重载后,其优先性与结合性与对应的内置类型保持一致。
- 不能连接语法没有的符号来创建运算符,比如operator@
- .* :: sizeof ?: . 这五个运算符不能重载
- 重载++运算符时,有前置和后置,运算符重载函数名都是operator++,不好区分,所以,c++规定重载后置++时,增加一个形参int,与前置++构成重载。
- 重载<<和>>时,需要重载为全局函数,因为如果重载为成员函数,this指针默认抢占了第一个形参位置,第一个形参位置是左侧运算对象,调用时就变成了 对象<<cout,不符合习惯和可读性。
int operator+();
int operator-();
int& operator+=();
int& operator-=();
int operator++(int);//后置
int& operator++();//前置
const成员
将const修饰的 “成员函数” 称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针。表明该函数不能对类的任何成员进行修改。
假设一个类类型A
//错误代码
const A a1;
a1.func();
void A::func();
&a1的类型是const A*,func成员函数中隐含的this指针类型是A*,如果const A* 类型传给A* 类型会造成权限放大,但权限只能缩小不能放大,所以这样的写法不正确。
//正确代码
const A a1;
a1.func();
void A::func() const;
用const修饰成员函数,隐含的this指针类型变成const A* const this,这种写法就合理了。
取地址运算符重载
取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,这两个运算符重载函数系统默认生成的足够我们使用了,一般不需要去显示实现,除非一些很特殊的场景,比如我们不想让别人取到当前类对象的地址,就可以自己实现一份。