c++中的this指针
创始人
2024-03-29 17:20:00
0

1.this指针的引入

首先我们看下面这一段代码

class Date
{
public:void DateSet(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;d1.DateSet(2022, 12, 9);d1.print();Date d2;d2.DateSet(2002, 3, 8);d2.print();return 0;
}

image-20221209103417145

对于刚开始学习c++的同学来说,你肯定会有这样的疑惑,为什么d1调用prinf()函数和d2调用print()函数的结果是这样的?prinf()这个函数也没有参数呀,为什么d1,d2分别调用printf()函数结果会不同呢。调用一个无参的函数,结果应该都是一样的呀。

其实是这样的,成员函数print()并不是真正的无参函数,其实有一个隐藏的参数this指针,我们调用的时候也并不是真的没有传参,而是d1调用的时候就把&d1传给了this,d2调用的时候把&d2传给了this。

image-20221209104837288

2.this指针的特性

  • this指针存在于类的每个非静态成员函数
  • this指针具有const属性
  • this指针只能在成员函数的内部使用
  • this指针是一个形参,对象中并不存储this指针

3.关于this指针的面试题

  1. this指针存在哪里?

    this指针本质上是一个形参,我们知道函数调用会建立栈帧,而在这之前需要先将形参入栈,所以形参应该在栈上。

    此外,有些编译器会优化,可能直接把this指针放到寄存器里面了。因为寄存器的速度比内存快很多,对于这种比较小的且频繁使用指针,直接放在寄存器是很合适的。

  2. this指针可以为空吗?

    首先nullptr是什么呢?以32位为例,进程虚拟地址空间的大小是4G个字节,从0x00000000到0xFFFFFFFF共2^32个字节(即4G)。nullptr就是0x00000000的地址,nullptr = (void*)0;这个地址不能用来存放数据,所以当我们写类似下面这种代码的时候会报错

    int* p = nullptr;//这里其实发生了隐式类型转换,nullptr原本是void*类型,转换成了int*
    *p = 10;//不让存放数据的地方你偏要放数据,非法访问。
    

    this指针肯定需要访问的呀,nullptr又不允许被访问,那肯定报错啊,所以this指针不能为空。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...