• C++基础——this指针


    目录

    一.this指针

    1.this指针定义:

     2.this指针的特性

    3.this指针存在的位置?


    一.this指针

     例:

    1. class Date{
    2. public:
    3. void Print(int year , int month , int day ) {
    4. cout << year<<"-" << month << "-" << day << endl;
    5. }
    6. private:
    7. int _year;
    8. int _month;
    9. int _day;
    10. };
    11. int main() {
    12. Date d1;
    13. Date d2;
    14. d1.Print(2021,12,31);
    15. d2.Print(2022,7,16);
    16. return 0;
    17. }

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

    1.this指针定义:

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

            其实类中的Print函数就拥有隐藏的this指针,如下图:

    1. void Print() {
    2. cout << _year << "-" << _month << "-" << _day << endl;
    3. }
    4. //等价于下面的Print函数
    5. void Print(Date* this){
    6. cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
    7. }
    8. int main(){
    9. Date d1;
    10. di.Print(&d1);//将di的地址传给this指针
    11. }

            但void Print(Date* this)函数中,this指针的定义和传递都是编译器的活,我们不可越俎代庖,不能去抢,会编译失败! 

    但我们可以在类中去使用this指针:

    1. void Print() {
    2. cout <<this-> _year << "-" <<this-> _month << "-" <<this-> _day << endl;
    3. }

     

     

     

     2.this指针的特性

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

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

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

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

    3.this指针存在的位置?

            所以this指针是存在函数栈帧中的,也就是说在类中,每个成员函数都有一个隐藏的this指针,在主函数main中,对象调用类成员函数时,都会把该对象的地址传给this指针,然后对象就可以通过this指针去访问了。

    练习题:

    1.下面程序编译运行结果是? A、编译报错         B、运行崩溃         C、正常运行

    1. class A
    2. {
    3. public:
    4. void Print()
    5. {
    6. cout << "Print()" << endl;
    7. }
    8. private:
    9. int _a;
    10. };
    11. int main()
    12. {
    13. A* p = nullptr;
    14. p->Print();
    15. return 0;
    16. }

            类成员函数Print是处在公共区域的,类类型指针对象为空指针,不发生解引用,所以程序正常执行。

            

    2.下面程序编译运行结果是? A、编译报错         B、运行崩溃         C、正常运行

    1. class A
    2. {
    3. public:
    4. void PrintA()
    5. {
    6. cout<<_a<
    7. }
    8. private:
    9. int _a;
    10. };
    11. int main()
    12. {
    13. A* p = nullptr;
    14. p->PrintA();
    15. return 0;
    16. }

     类成员变量是私有的,空指针发生解引用现象,所以运行崩溃。

  • 相关阅读:
    OPA Gatekeeper:Kubernetes的策略和管理
    #机器学习--高等数学基础--第三章:微分中值定理与导数的应用
    数据结构——栈的讲解(超详细)
    记录 Maven 版本覆盖 Bug 的解决过程
    计算机网络408考研 2021
    u盘打不开,提示需要格式化怎么办?
    在ffmpeg上实现libhevc wrapper
    C和指针 第14章 预处理器 14.3 条件编译
    道可云元宇宙每日资讯|《江苏省元宇宙产业发展行动计划》发布
    springcloud之gateway服务网关
  • 原文地址:https://blog.csdn.net/weixin_69283129/article/details/127771023