C++-----带你进一步理解this指针(附面试题)

本文解释了this指针的基本概念,指出它并非仅在形参名与成员变量名冲突时使用,而是始终存在,用于表示对象的地址。文章还讨论了this指针在函数调用中的行为,以及在面试中可能遇到的相关题目和陷阱。
摘要由CSDN通过智能技术生成

1.到底什么是this指针,你未必明白

(1)不知道其他的老师是如何讲解的,我们老师当时讲的就是当我们的类里面的成员和形参的名字冲突的时候,我们使用this指针表示指向我们的成员变量,没有带this的表示我们的形参,用这个区分当名字相同的时候,谁是成员变量,谁是形式参数,在我的最初印象里面,好像这个所谓的指针就是用来区分形参和成员变量的;

(2)今天,我才对this指针有了一点点清晰的认识:这个this指针其实并不像我想象的那样,其实就算我们的形参的名字和成员变量的名字不相同的时候,这个this指针也是存在的,只是我们没有写出来罢了,由此可见this指针本来就是存在并且发挥作用的,并不是像我想象的那样,当形参的名字和我们的成员变量的名字一样的时候才会有用,其实this指针是一直存在的,这个我们要理解

(3)看下面的这种图片,里面就显示了this指针的存在位置,只不过我们不能在形参里面去显示出来,也就是说我们的init这个初始化的成员函数是有4个参数的,3个是我们的形参,还有一个就是隐藏的this指针,这个指针是存在的,但是我们不能在形参里面显示出来,我们在函数里面是可以使用的,但是我们一般不会用;

(4)可见this指针就是我们定义的对象的地址,我们在主函数里面传递的除了年份,月份和日期,其实还有我们的对象的地址,this指针就是接受的我们的对象的地址;

(5)坦率来讲,我们认识到这里还是不够的,因为实际上这个隐藏的this指针前面是有const进行修饰的,我们是无法进行加加等之类的操作,但是像一般的指针变量我们是可以进行这些操作的;

(5)this指针存在栈帧里面,虽然这个指针是我们定义的对象的。

2.this指针面试题目

(1)原始题目

(1)这个里面我们是定义了一个A类,使用这个类定义了一个指针变量p,然后进行调用这个函数Print,这里实际上我们的成员函数是公有的函数,我们定义的所有的对象都可以使用,因此这个成员函数肯定不是放在某一个对象里面的,他会放在公共的代码区,p->print实际上就是在公共代码区里面找到这个函数的名字,并没有解引用;

(2)(*p).print看似进行了解引用的操作,实际上还是没有接引用的,为什么这样讲呢?因为我们分析的时候不能只看代码的外在形态,而要意识到他调用的print函数就是在公共的代码去里面,编译器会进行优化处理,因此这两种写法实际上是没有任何区别的,虽然表面上看起来第二个写法进行了解引用的操作,实际上编译器并不会这样干,因此上面的两种,程序都会执行输出结果的;

(2)变式题目

我们这里只是把函数体里面的输出变成了我们定义的一个成员变量,但是这样做就会引起程序的崩溃,为什么呢?

我们前面已经提到了this指针,这个指针接收到了我们传递过去的指针变量p的地址,就和上面的类似,我们之前的那个是定义了一个对象d1,我们传递的就是d1的地址,我们现在是定义了一个指针变量p,按照逻辑,我们传递的就是p指针的地址,我们的this指针进行接收,实际上_a应该是打印输出this->_a,那么我们的p是空的,解引用_a肯定就会造成程序的崩溃啊,之前为什么没有呢,因为我们之前只是传递了他的地址,打印输出的内容并没有牵扯到我们的成员变量,相当于知识传递了空指针的地址,并没有对其造成实质性的影响,但是下面的,我们是使用了里面的_a这个变量,所以会报错,导致程序崩溃。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值