目录
例:
- class Date{
- public:
- void Print(int year , int month , int day ) {
- cout << year<<"-" << month << "-" << day << endl;
- }
- private:
- int _year;
- int _month;
- int _day;
- };
-
- int main() {
- Date d1;
- Date d2;
- d1.Print(2021,12,31);
- d2.Print(2022,7,16);
- return 0;
- }
Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函 数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
其实类中的Print函数就拥有隐藏的this指针,如下图:
-
- void Print() {
- cout << _year << "-" << _month << "-" << _day << endl;
- }
-
- //等价于下面的Print函数
-
-
- void Print(Date* this){
- cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
- }
-
- int main(){
- Date d1;
- di.Print(&d1);//将di的地址传给this指针
- }
但void Print(Date* this)函数中,this指针的定义和传递都是编译器的活,我们不可越俎代庖,不能去抢,会编译失败!
但我们可以在类中去使用this指针:
- void Print() {
- cout <<this-> _year << "-" <<this-> _month << "-" <<this-> _day << endl;
- }
1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
2. 只能在“成员函数”的内部使用。
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。
4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递。
所以this指针是存在函数栈帧中的,也就是说在类中,每个成员函数都有一个隐藏的this指针,在主函数main中,对象调用类成员函数时,都会把该对象的地址传给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;
- }
类成员函数Print是处在公共区域的,类类型指针对象为空指针,不发生解引用,所以程序正常执行。
2.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
- class A
- {
- public:
- void PrintA()
- {
- cout<<_a<
- }
- private:
- int _a;
- };
- int main()
- {
- A* p = nullptr;
- p->PrintA();
- return 0;
- }
类成员变量是私有的,空指针发生解引用现象,所以运行崩溃。