找回密码
 立即注册
查看: 388|回复: 0

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

[复制链接]
发表于 2023-4-5 18:23 | 显示全部楼层 |阅读模式
回到 研磨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++主目录

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 22:50 , Processed in 0.136075 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表