在《类与对象(二)》中提到了类会生成六个默认成员函数,并且介绍了前四个默认成员函数,本篇来介绍最后两个默认成员函数和const修饰类的成员函数。
目录
1. const修饰类的成员函数
const修饰类成员函数,实际修饰该成员函数隐含的 this 指针,被修饰的 this 指针中的成员不能再被修改。
举例:
没有被const修饰的类的成员函数:
再来看一个函数:
d.Print() 经过编译器处理为 d.Print(&d) , 而函数 func 的形参类型是 const Date ,
即 d 的类型为 const Date ,
那么 d.Print(&d) 中 &d 传给 类中成员函数 Print 的形参上 ,形参的类型应该为 const Date* ,即指针指向的内容不能被修改
而类中成员函数 this 指针的类型是 Date* const ,指针指向的内容可以被修改,const修饰的是 this 指针,this 指针初始化后不能被更改
实参类型const Date* 传给形参类型 Date* const ,这样就造成了权限放大问题,因此会报错。
由上述分析可知,我们只需要将
void Print(Date* contst this) 变为 void Print(const Date* contst this)
但是void Print(Date* contst this) 是编译器处理的,我们不能自己写上去
因此c++ 中是可以让我们这样解决的const添加问题:
那么什么情况可以在成员函数后加 const 呢?
当函数成员中不修该指针所指向的内容是,成员函数后可以加 const
若声明和定义分离,声明和定义都要加 const
2. 取地址操作符重载
示例:
Date* operator&()
{
return this;
}
3. const取地址操作符重载
示例:
const Date* operator&() const
{
return this;
}
总结
到底调用取地址操作符重载还是const取地址操作符重载,是由取地址对象的类型决定的
取地址操作符重载和const取地址操作符重载是默认成员函数
即使不创建也会默认生成
什么时候需要自己写:
当不想让别人拿到真实地址的时候,可以自己写,返回其他地址,比如空指针:
Date* operator&()
{
return nullptr;
}
const Date* operator&() const
{
return nullptr;
}