当前位置:   article > 正文

C++:this指针(二)

C++:this指针(二)

this指针:

  1. class Date
  2. {
  3. public:
  4. void Init(int year, int month, int day)
  5. {
  6. _year = year;
  7. _month = month;
  8. _day = day;
  9. }
  10. void Print()
  11. {
  12. cout <<_year<< "-" <<_month << "-"<< _day <<endl;
  13. }
  14. private:
  15. int _year; //
  16. int _month; //
  17. int _day; //
  18. };
  19. int main()
  20. {
  21. Date d1, d2;
  22. d1.Init(2022,1,11);
  23. d2.Init(2022, 1, 12);
  24. d1.Print();
  25. d2.Print();
  26. return 0;
  27. }

对于上述类,有这样的一个问题: Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函 数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?

根据之前的博文,我们得知了类中的成员函数是处在一个公共的区域,类中的成员变量仅仅只是声明,只有在主函数内部定义了 以类为类型的变量,才算是开辟了成员变量的空间。 

同时,在成员函数内部的成员变量,也同类中的成员变量一样,仅仅只是一个声明。

并且因为需要知道调用的函数的对象是谁,C++引入了一个隐藏的指针 this

即:C++编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编 译器自动完成。

this的特性:

1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。

注意 const 在*之前是说明指针指向的内容不可以改变 在*之后表示指针不可以被改变

2. 只能在“成员函数”的内部使用 

 3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针

4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递

 5.this 指针一般存储在栈内,但是有些编译器会将其存储在寄存器中,例如VS

相关面试题型:

  1. // 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
  2. class A
  3. {
  4. public:
  5. void PrintA()
  6. {
  7. cout << "Print()" << endl;
  8. }
  9. private:
  10. int _a;
  11. };
  12. int main()
  13. {
  14. A* p = nullptr;
  15. p->PrintA();
  16. return 0;
  17. }

解答: 
考点在 p->printA()

因为成员函数不在 定义的对象 所开辟的空间内部 ,所以这个p->printA()解引用是无效的

解引用是指去 p 指向的空间去寻找,但是printA不在p指向的空间内部。
换句话说,printA不在p开辟的空间内部
所以因为找不到,也就是说编译器觉得这个是没有用的,所以空指针的效果是无效的,因为空指针无效,语法也没有问题,空指针不会被解引用,所以可以正常运行!

  1. // 2.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
  2. class A
  3. {
  4. public:
  5. void Print()
  6. {
  7. cout<<_a<<endl;
  8. }
  9. private:
  10. int _a;
  11. };
  12. int main()
  13. {
  14. A* p = nullptr;
  15. p->Print();
  16. return 0;
  17. }
  • 解答:
  •  在这里,p是一个指向A类型的指针,但是它被初始化为nullptr,也就是空指针。
  • 恰巧,_a就在p开辟的空间内部,但是p被赋予了空指针,所以寻访_a是错误的!

  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/94888?site
推荐阅读
相关标签
  

闽ICP备14008679号