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

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这个变量,所以会报错,导致程序崩溃。

相关推荐

  1. C语言】完全理解指针(三)函数指针数组

    2024-04-27 16:26:06       33 阅读
  2. 从汇编层面理解C++ this指针

    2024-04-27 16:26:06       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 16:26:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 16:26:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 16:26:06       87 阅读
  4. Python语言-面向对象

    2024-04-27 16:26:06       96 阅读

热门阅读

  1. gdb 进阶使用记录(主要是关于 optimized out)

    2024-04-27 16:26:06       37 阅读
  2. (数字化)采购系统建设的主要步骤是什么?

    2024-04-27 16:26:06       37 阅读
  3. [USACO18DEC] S 补题报告

    2024-04-27 16:26:06       37 阅读
  4. 阿里云oss文档预览与快照

    2024-04-27 16:26:06       36 阅读
  5. mysql 临时表 dual postgre 是否也有

    2024-04-27 16:26:06       143 阅读
  6. 若依框架学习-springboot-gateway笔记

    2024-04-27 16:26:06       43 阅读
  7. 商城数据库88张表结构完整示意图(1——15)

    2024-04-27 16:26:06       32 阅读
  8. Django框架模板位置(默认&自定义)

    2024-04-27 16:26:06       29 阅读
  9. Rust的Vec<T>

    2024-04-27 16:26:06       68 阅读
  10. 如何使用chatgpt修改代码

    2024-04-27 16:26:06       30 阅读
  11. python连接Mysql数据库

    2024-04-27 16:26:06       32 阅读
  12. elasticsearch Docker启动Device or resource busy异常

    2024-04-27 16:26:06       30 阅读
  13. 大数据组件之storm简介

    2024-04-27 16:26:06       30 阅读
  14. 2024.4.26

    2024-04-27 16:26:06       28 阅读