【c++】隐藏的this指针

this指针

• Date类中有Init与Print两个成员函数,函数体中没有关于不同对象的区分,那当d1调⽤Init和 Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这⾥就要看到C++给了⼀个隐含的this指针解决这⾥的问题

• 编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this指针。⽐如Date类的Init的真实原型为 void Init(Date* const this, int year, int month, int day)

this指针本身是不能被修改的,但是内容是可以修改的

• 类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_ year 赋值, this- >_year = year;

• C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显⽰使⽤this指针。

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

cpp 复制代码
#include<iostream>
using namespace std;
class Date 
{
public: 
    // void Init(Date* const this, int year, int month, int day)
    void Init(int year, int month, int day) 
    {
        // 编译报错:error C2106: "=": 左操作数必须为左值  
        // this = nullptr; 
        
        // this->_year = year; 
        _year = year;//也可以写成上面这句代码,建议不加this
        this->_month = month;
        this->_day = day; 
    } 
    void Print() 
    {
        cout << _year << "/" << _month << "/" << _day << endl; 
    } 
private:
    // 这⾥只是声明,没有开空间 
    int _year;
    int _month; 
    int _day; 
};
int main() 
{ 
    // Date类实例化出对象d1和d2  
    Date d1;
    Date d2;
    // d1.Init(&d1, 2026, 3, 1); 
    d1.Init(2026, 3, 1); 
    d1.Print();
    // d2.Init(&d2, 2024, 7, 5);
    d2.Init(2024, 7, 5); 
    d2.Print();
    return 0;
} 

测试

1.下⾯程序编译运⾏结果是()

A、编译报错 B、运⾏崩溃 C、正常运⾏

cpp 复制代码
#include<iostream>
using namespace std;
class A 
{ 
public: 
    void Print()
    {
        cout << "A::Print()" << endl;
    } 
private:
    int _a; 
}; 
int main() 
{ 
    A* p = nullptr; 
    p->Print();//与普通函数一样,指针用->调用函数,相当于(*p).Print(); 
    return 0; 
}

答案选C

空指针或野指针是运行逻辑错误,编译错误是检查出语法错误,所以A错

如果函数体内没有访问任何成员变量(即不通过this指针访问数据成员),那么即使this指针为空,调用也可能成功,因为函数调用实际上是通过指针进行的(编译的时候在公共代码区中找到这个函数,只需要call函数地址就行),但函数本身并不解引用this指针。这里Print()函数只是打印一条消息,没有使用任何成员变量,所以它不会访问this指针指向的内存。

2.下⾯程序编译运⾏结果是()

A、编译报错 B、运⾏崩溃 C、正常运⾏

cpp 复制代码
#include<iostream>
using namespace std; 
class A 
{ 
public: 
    void Print()
    {
        cout << "A::Print()" << endl;
        cout << _a << endl;
    }
private: 
    int _a; 
};
int main()
{ 
    A* p = nullptr; 
    p->Print();
    return 0; 
} 

答案选B

此程序崩溃是在Print()中,会隐含一个this->_a,而this指针是一个空指针,访问this指针_a的位置,就要对空指针进行解引用,此时就会崩溃

3.this指针存在内存哪个区域的()

A.栈 B.堆 C.静态区 D.常量区 E.对象⾥⾯

答案选A

this指针是个形参,形参是在函数的栈桢里,在函数的栈桢里面的变量是属于栈中的。

有时编译器会使用寄存器对其进行优化,因为this指针会被高频访问,此时this指针会存在寄存器中

相关推荐
良木生香14 小时前
【C++初阶】C++编程基石:编码表&&STL的入门指南
c语言·开发语言·数据结构·c++·算法
并不喜欢吃鱼14 小时前
从零开始C++----四.vector的使用与底层实现
开发语言·c++
沐雪轻挽萤14 小时前
17. C++17新特性-并行算法 (Parallel Algorithms)
java·开发语言·c++
A7bert77714 小时前
【YOLOv8部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·人工智能·python·深度学习·yolo·机器学习
EllinY15 小时前
扩展欧几里得算法 exgcd 详解
c++·笔记·数学·算法·exgcd
量子炒饭大师15 小时前
【C++11】RAII 义体加装指南 ——【包装器 与 异常】C++11中什么是包装器?有哪些包装器?C++常见异常有哪些?(附带完整代码讲解)
开发语言·c++·c++11·异常·包装器
炘爚15 小时前
深入解析内存分区:程序运行的秘密
c++
网域小星球16 小时前
C++ 从 0 入门(五)|C++ 面试必知:静态成员、友元、const 成员(高频考点)
开发语言·c++·面试·静态成员·友元函数
|_⊙16 小时前
C++11 右值引用
开发语言·c++
李昊哲小课16 小时前
WSL Ubuntu 24.04 GPU 加速环境完整安装指南
c++·pytorch·深度学习·ubuntu·cuda·tensorflow2