❀this指针的引入
我们先定义一个Date类:
class Date { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } void Print() { cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; //年 int _month; //月 int _day; //日 }; int main() { Date d1, d2; d1.Init(2023, 4, 23); d1.Print(); d2.Init(2011, 1, 1); d2.Print(); return 0; }
运行结果>
对于这个结果,有一个疑问,Date类中定义了Init和Print两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函数时,该函数是怎么知道应该设置d1对象,而不是设置d2对象呢?
对于这个疑问,C++中引入了this指针来解决这个问题。
当我们调用成员函数时,实际上是替某个对象调用它。成员函数通过一个名为 this 的额外隐式参数来访问调用它的那个对象,当我们调用一个成员函数时,用请求该函数的对象地址初始化 this。
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该 指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
❀this指针的特性
1..this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
2.只能在“成员函数”的内部使用
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。 所以对象中不存储this指针。
4.this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递
【面试题】
- this指针存在哪里?
答:首先this指针是形参,所以他是跟普通参数一样存在函数调用的栈帧里面。但是vs编译器对this指针传递进行了优化,对象地址是放在ecx、ecx存储this指针的值。 - this指针可以为空吗?
先来看这么一段代码>
// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行 class A { public: void Print() { cout << "Print()" << endl; } private: int _a; }; int main() { A* p = nullptr; p->Print(); return 0; } // 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行 class A { public: void PrintA() { cout << _a << endl; } private: int _a; }; int main() { A* p = nullptr; p->PrintA(); return 0; }
答案显然可以为空,当我们调用函数时,如果函数内部不需要使用到this,也就是不需要通过this指向当前对象并对其进行操作时才可以为空(当我们在其中什么都不放或者在里面随便打印一个字符串),如果调用的函数需要指向当前对象,并进行操作,则会发生错误(空指针引用)就跟C中一样不能进行空指针的引用。
🍀小结🍀
今天我们学习了this指针相关的细节相信大家看完有一定的收获。