1.赋值运算符重载
1)运算符重载
·运算符重载是具有特名字的函数,他的名字是由operator和后面要定义的运算符共同构成(如operator+,operator=,operator>等等)同样具有返回类型,参数等。
·重载运算符函数的参数个数和该运算符作用的运算对象数量⼀样多。几元运算符就要有几个参数,二元运算符的左侧运算对象传给第⼀个参数,右侧运算对象传给第二个参数。
*如果⼀个重载运算符函数是成员函数,则它的第一个运算对象默认传给隐式的this指针,因此运算 符重载作为成员函数时,参数比运算对象少⼀个。
·无法重载的五个运算符:
.* :: sizeof ?: .
·重载操作符至少有⼀个类类型参数,不能通过运算符重载改变内置类型对象的含义。
·重载++运算符时,有前置++和后置++,运算符重载函数名都是operator++,无法很好的区分。 C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,方便区分。
Date Date::operator++(int)//后置++
Date& Date::operator++()//前置++
·重载>>和<<时,需要重载为全局函数,因为重载为成员函数,this指针默认抢占了第⼀个形参位 置,第⼀个形参位置是左侧运算对象,调用时就变成了------对象<<cout(与阅读习惯相悖)重载为全局函数把ostream/istream放到第⼀个形参位置就可以了,第二个形参位置当类类型对象。
ostream& operator<<(ostream& out, const Date& d);
istream& operator>>(istream& in, Date& d);
//注意要在类中进行友元函数声明,否则无法访问d的私有,从而不能输入输出
2)赋值运算符重载
*赋值运算符重载是⼀个默认成员函数,用于完成两个已经存在的对象直接的拷贝赋值,这里要注意跟拷贝构造区分,拷贝构造用于⼀个对象拷贝初始化给另⼀个要创建的对象。
*赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。
·有返回值(为支持连续赋值),且建议写成当前类类型引用,引用返回可以提高效率。赋值运算重载的参数建议写成 const当前类类型引用,否则会传值传参会有拷贝
·没有显式实现时,编译器会自动生成⼀个默认赋值运算符重载,默认赋值运算符重载行为跟默认构造函数类似,对内置类型成员变量会完成值拷贝/浅拷贝(⼀个字节⼀个字节的拷贝),对自定义类型成员变量会调用他的拷贝构造。
·如果⼀个类显示实现了析构并释放资源,那么他就需要显示写赋值运算符重载,否则就不需要。
2.取地址运算符重载
1)const成员函数
void Print(const Date* const this) const;
void Print() const;
const修饰在C++中放在最后,注意写法。
2)取地址运算符重载
取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,⼀般这两个函数编译器自动生成的就可以够我们用了,不需要去显示实现。除非⼀些很特殊的场景,比如我们不想让别人取到当前类对象的地址,就可以自己实现⼀份,胡乱返回⼀个地址。
Date* operator&()
{
//return this;
//return nullptr;
return (Date*)0x2673FF40;
}
const Date* operator&() const
{
//return this;
//return nullptr;
return (Date*)0x2673FE30;
}