Azuma 发表于 2023-4-5 18:23

【你没在意】揭秘成员函数尾巴上的const

回到 研磨C++主目录
标题是不是逐渐浮夸了?咯咯咯……


      “常量指针,指针常量”萦绕耳畔,不可以修改指针本身和不可以修改指针指向的内容,傻傻分不清楚。如果我们一开始就了解top-level const,或许就可以避免苦苦念叨“常量指针,指针常量”,死记硬背了。
const的威力很大,用法多种多样。今天我们就来扒一扒其中一种用法——成员函数尾巴上的const。 先看看它长什么样子吧:
class Student
{
public:
    Student(int age);
    int GetAge() const // <== 看这里,就是这个款式
    {
      return _age;
    }
private:
    int _age;
};
下面代码中哪个是top-level const呢?
int i = 10;
const int* const p = &i;
左边的const是用来限定指针指向的内容不可以修改,右边的const是限定指针本身不可以修改,所以右边的是top-level const。
<hr/>如果弄清楚了const int* const p = &i;中的top-level const和low-level const,那么弄清楚
int GetAge() const
{
    return _age;
}
中的const的用途就很容易了。
int main()
{
    Student jim{10};
    auto age = jim.GetAge();

    return 0;
}
稍有了解C++的同学基本都知道,调用一个对象的成员函数,其中是有一个隐含的this指针的,上面对于类成员函数GetAge()以及调用的伪代码如下:
/******** 为了说明问题而写的伪代码 ********/
// 函数实现部分
int Student::GetAge(const Student* const this) // <== 看下左边括号里面,保持3秒
{
    return this->_age;
}

// 代码调用部分
auto age = Student::GetAge(&jim);
形式参数const Student* const this是不是有点眼熟了?透过现象看本质:

[*] 对于类的对象隐式this指针,是对象在内存中的地址,是一个对象出生之后在内存中的唯一标识,因此它是不可以被修改的,对应的是右边那个const(属于top-level const),修改一个对象的地址没道理的。因为这个this指针是隐式的,对于C++开发人员不用操心,C++语言机制本身就管理好了。
[*]而对于一个具体的Student对象而言,在调用它的成员函数时,它所拥有的成员变量是否允许修改就不能由C++语言机制去约束了,所以就只能由开发人员去控制了。由此就出现了函数尾巴上的const,其作用跟const Student* const this中左边的const作用是一样的,用来约束this指针的内容不可修改,是一个low-level const。
<hr/>总结:
大概弄明白了尾巴上的const的具体作用,至于在实际开发中怎么应用还是取决于设计人员的设计思想,细节往往能够显示水平。
水平有限,欢迎评论区指正交流;
点赞、关注、收藏、喜欢是我持续输出的动力,需要知友的夸夸~
回到 研磨C++主目录
页: [1]
查看完整版本: 【你没在意】揭秘成员函数尾巴上的const