c++中的this指针
创始人
2024-03-29 11:30:50
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指针不能为空。

相关内容

热门资讯

财政部详解财政政策如何“更加积... 12月27日至28日,全国财政工作会议在北京召开。会议总结2025年财政工作,布置2026年重点任务...
推荐靠谱再审律师团队,王文婷律... 在法律纠纷的世界里,再审是当事人在经历一审、二审败诉后的后希望。然而,再审程序复杂、法定要求严苛,寻...
攀枝花警方通报:仁和区发生一起... 大象新闻2025-12-27 14:11:24 12月27日,攀枝花警方发布警情通报: 2025年...
《四川省惠企政策全生命周期管理... 为规范惠企政策全生命周期管理和运行,进一步提升惠企政策服务水平和效能,近日我省出台《四川省惠企政策全...
专业检查监督律师哪家强?王文婷... 在法律纠纷的解决过程中,当面临一审、二审、再审接连败诉的困境,或是遭遇复杂经济纠纷、刑事指控等情况时...
升达林业5亿元担保纠纷再审申请... 12月28日,升达林业(002259)披露全资子公司中弘达公司与厦门国际银行之间的质押合同纠纷案的进...
7亿元“互诉”大戏上演!大金重... 12月28日,大金重工(002487)发布关于诉讼事项的进展公告,一场与中国葛洲坝集团电力有限责任公...
50余位法律人晨跑椰城 共话专... 人民网海口12月28日电 (记者李学山)12月27日清晨7时30分,海口红城湖畔晨雾缭绕,随着一声“...
男子因纠纷引燃易燃物品致本人死... 12月28日,成都市公安局高新区分局发布警情通报: 12月28日下午,高新区南三环路四段一汽车销售服...
茅台称尽最大努力防止价格炒作,... 备受关注的茅台2026年全国经销商联谊会于12月28日下午举行。2025年在经历了换帅,一年内飞天茅...