这是一篇VIP文章,如果你还不是会员,请移步https://www.ilikexff.cn/articles/150免费阅读。
如果你没有其他面向对象的编程语言基础,比如Java
、c#
等,那么你在学习C++面向对象时可能会好奇,当一个成员函数被调用的时候,C++是如何跟踪它被调用的对象的?
考虑下面的程序:
#include <iostream>
class Simple
{
private:
int m_id{
};
public:
Simple(int id)
: m_id{
id }
{
}
int getID() const {
return m_id; }
void setID(int id) {
m_id = id; }
void print() const {
std::cout << m_id; }
};
int main()
{
Simple simple{
1};
simple.setID(2);
simple.print();
return 0;
}
对于上述代码,当我们调用 simple.setID(2);
时,C++知道函数 setID()
应该对对象 simple 进行
操作,并且 m_id
实际上引用了 simple.m_id
。
为什么会这样?这因为C++使用了一个名为this
的隐藏指针。
隐藏的this指针
在每一个成员函数中,关键字this
是一个常量指针,它保存当前隐式对象的地址。因此,下面两种写法是等效的;
void print() const {
std::cout <<m_id;}
void print() const {
std::cout <<this->m_id;}
但是事实证明,前者是后者的简写。当我们程序编译时,编译器将隐式地在引用隐式对象的任何成员前面加上this->
。 这有助于我们的代码跟更简洁,而不需要一遍遍的重复this->
我们使用
->
从指向对象的指针中选择成员。this->m_id
相当于(*this).m_i