先来看一段代码:
#include
using namespace std;
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
int main() {
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1, d2;
d1.Init(2022, 1, 11);
d2.Init(2022, 1, 12);
d1.Print();
d2.Print();
return 0;
}
上面代码运行后运行结果如下:
看到这里我们不禁提出提出疑问,编译器是怎么识别输出的???
这是因为c++有一个this指针来帮助识别,将上面的代码变成了如下:
这样是不是就更加明了了,是this指针来帮助我们来进行识别的,只不过是编译器帮助我们做了这个工作,但是在编写程序中我们不要将this指针写出来,上边只是为了理解所以我将this指针写出来了。
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this指针不能显示的写实参和形参,但是可以在类里面显示的使用。
例如:
这里就将void*this去掉了,但是下面访问成员变量又用了this指针,这也就证明this指针确实是存在的。
另外this指针不是存在于对象中,而是存在于栈帧中。
一个题来帮助理解this指针:
#include
using namespace std;
// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
void PrintA()
{
cout << "printfA()" << endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->PrintA();
return 0;
}
运行结果如下:
这里这个程序是正常运行,因为成员变量在类的对象中,但是成员函数不在类的对象中,这里虽然将对象的指针p给置为空指针了,但是并不影响调用成员函数。
下面将这个题进行改动:
#include
using namespace std;
// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
void PrintA()
{
cout << _a << endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->PrintA();
return 0;
}
这里运行崩溃了,为什么?
因为这里的对象的指针p置为空了,那么this指针就为空,就找不到成员变量_a了。