宣传部网站建设方案,那家财经网站做的好,电商网页模板,免费空间申请2021目录 一、const成员函数 1. const成员函数是什么#xff1f; 2. 为什么有const成员函数#xff1f; 3. 什么时候需要使用const修饰成员函数#xff1f; 二、取地址运算符重载 1. 为什么需要重载取地址运算符#xff1f; 2. 默认取地址运算符重载函数 3. 默认const取地址运…目录 一、const成员函数 1. const成员函数是什么 2. 为什么有const成员函数 3. 什么时候需要使用const修饰成员函数 二、取地址运算符重载 1. 为什么需要重载取地址运算符 2. 默认取地址运算符重载函数 3. 默认const取地址运算符重载函数 4. 什么时候要显示重载取地址运算符 一、const成员函数
1. const成员函数是什么 const修饰的成员函数称为const成员函数这个const是用来修饰隐藏的this指针的。 class B{
public:int func()const{}
};
将 const修饰的“成员函数”称之为 const成员函数const修饰类成员函数
实际修饰该成员函数隐含的 this指针表明在该成员函数中不能对类的任何成员进行修改。 2. 为什么有const成员函数 const成员函数的出现解决了两个问题 如何保证无法通过成员函数修改成员变量const对象无法调用非const成员函数。 1. const成员函数保证了无法通过成员函数修改成员变量 2. const成员函数能被const对象调用不会产生权限放大问题。 3. 为什么const对象无法调用非const成员函数 每个成员函数第一个参数都是隐藏的this指针对象在调用成员函数时会将对象的地址传给这个this指针但将const对象传给this指针就会造成权限放大问题。 this 指针本身是 类名* const 类型的比如Date类的this指针类型是 Date* const这里的const在*后面不同于const Date对象取地址后的类型const Date* 【在*之前修饰代表该指针指向对象的内容不能被修改地址里的内容不能改在*之后修饰代表该指针指向的对象不能被修改指向的地址不能改】而且const 对象只有读权限而this指针*前没const修饰有读写权限所以对象在调用成员函数将对象的地址传给这个this指针时会造成权限放大问题。 3. 什么时候需要使用const修饰成员函数 需要修改类中成员变量的成员函数(如专门用来修改成员变量的修改器)就不需要用const修饰。如果一个函数中不需要修改成员变量建议加const进行修饰因为const成员函数const对象可以调用非const对象也可以调用。 请思考下面的几个问题 const对象可以调用非const成员函数吗 答案不可以传递this指针时权限会放大非const对象可以调用const成员函数吗 答案可以传递this指针时权限缩小const成员函数内可以调用其它的非const成员函数吗 答案不可以传递this指针时权限会放大非const成员函数内可以调用其它的const成员函数吗 答案可以传递this指针时权限缩小 二、取地址运算符重载
1. 为什么需要重载取地址运算符 在上篇文章C 类和对象篇(七) 运算符重载中分析了重载运算符的原因为了让自定义类型能使用运算符。重载取地址运算符的目的也是如此让自定义类型也能使用取地址运算符()。 2. 默认取地址运算符重载函数 类中有6个默认成员函数其中就有默认取地址运算符重载函数所以即使类中没有定义取地址运算符重载函数对象依然能使用取地址运算符(): 3. 默认const取地址运算符重载函数 const取地址运算符重载函数也是默认成员函数所以即使类中没有定义取地址运算符重载函数const对象依然能使用取地址运算符(): 4. 什么时候要显示重载取地址运算符 一般不需要写编译器生成的默认的取地址和const取地址运算符重载函数完全够用。特殊情况下比如不想让别人获取对象的地址就可以自己实现返回nullptr 如果不想让别人获取对象的地址就可以重载取地址运算符返回nullptr
class A
{
public:A* operator(){return nullptr;}const A* operator()const{return nullptr;}
};
int main()
{A a;const A b;cout a endl;cout b endl;return 0;
} ------------------------END-------------------------
才疏学浅谬误难免欢迎各位批评指正。