
C++this指针
C++中的
发布日期:2021-05-11 00:31:14
浏览次数:17
分类:精选文章
本文共 1599 字,大约阅读时间需要 5 分钟。
C++中的 this
指针与成员函数调用机制
在面向对象编程中,每个对象都有自己的数据成员,而所有对象共享同一套成员函数代码。然而,当主函数调用成员函数时,系统需要明确区分哪一个具体对象正在调用该函数。这就通过 this
指针来实现。
this
指针的作用
每次调用一个成员函数,this
指针接收一个隐藏的参数,即调用该函数对象的地址。当调用一个对象的成员函数时,隐式传递了一个指针方向的参数来初始化 this
。例如:
class Person {public: Person() {} void display_this() { cout << "this指针的地址:" << this << endl; }private: int m_age;};int main() { Person p; cout << "p的地址:" << p << endl; // 输出对象地址 p.display_this(); // 传递p的地址到this}
在以上代码中,p
是一个 Person
对象。当 p.display_this()
被调用时,this
指针将被设置为 p
对象的地址。
this
指针的特点
常数指针
this
是一个指针,始终指向当前对象,不会随对象移动或函数返回而改变指向。隐式传递
在成员函数调用中,this
是隐式传递的,不需要显式地在函数定义中声明。常数成员函数
如果你希望某个成员函数无法修改对象的数据成员,可以使用 const
关键字标记函数。在这种情况下,this
指针将被转换为常量指针:
void display_this() const { cout << m_age << endl; // 隐式通过 this 访问 m_age cout << "this指针的地址:" << this << endl;}
如果尝试修改数据成员(如 m_age
),则会引发编译错误,因为 this
是常量指针。
###返回 this
对象的函数
某些成员函数会直接返回调用该函数的对象本身。这种函数通常名为 change
或 modify
,如下:
class Person {public: Person(int n) { this->m_age = n; // 初始化年龄 } void display() const { cout << m_age << endl; // 通过 this 输出当前对象的数据 } Person& change_age(int n) { this->m_age += n; // 修改当前对象的数据 return *this; // 返回对象本身 }private: int m_age;};int main() { Person p(10); // 创建一个 Person 对象,初始年龄为 10 p.change_age(10); // 修改年龄为 20 p.change_age(10); // 修改年龄为 30 p.display(); // 输出 30}
在上述代码中,change_age
函数不仅修改了对象的数据,还直接返回了对象的引用。这样可以允许连续调用多个成员函数,而无需再次通过对象引用调用。
###总结
this
指针通过将对象地址传递给成员函数,实现了“方法调用与对象绑定”的机制。每个成员函数都通过 this
指针了解当前调用对象,从而保证了对数据成员的正确访问和修改。这种机制是面向对象编程的核心,确保每个对象都能独立管理自己的数据。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月17日 19时08分23秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C语言编译错误列表
2019-03-07
看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
2019-03-07
python中列表 元组 字典 集合的区别
2019-03-07
Android DEX加固方案与原理
2019-03-07
iOS_Runtime3_动态添加方法
2019-03-07
Leetcode第557题---翻转字符串中的单词
2019-03-07
Problem G. The Stones Game【取石子博弈 & 思维】
2019-03-07
Java多线程
2019-03-07
openssl服务器证书操作
2019-03-07
我用wxPython搭建GUI量化系统之最小架构的运行
2019-03-07
selenium+python之切换窗口
2019-03-07
重载和重写的区别:
2019-03-07
搭建Vue项目步骤
2019-03-07
账号转账演示事务
2019-03-07
SpringBoot找不到@EnableRety注解
2019-03-07
在Vue中使用样式——使用内联样式
2019-03-07
Explore Optimization
2019-03-07
map[]和map.at()取值之间的区别
2019-03-08