1.Cpp中的this指针

  • 在C++中,每一个对象都能通过this指针来访问自己的地址。this指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。友元函数没有this指针,因为友元不是类的成员,只有成员函数才有this指针。
  • this指针实例1如下:
        #include "iostream"using namespace std;class Box{public:// 构造函数定义Box(double l = 2.0, double w = 3.0, double h = 4.0): length(l), width(w), height(h){cout << "这是Box的构造函数...\n";}// 普通成员函数double Volume(){return length * width * height;}int compare(Box box){return this->Volume() > box.Volume();}private:int length;int width;int height;};int main(){Box box1(3.3, 2.1, 1.5);Box box2(8.5, 6.0, 2.0);if(box1.compare(box2))cout << "box2 小于 box1\n";elsecout << "box2 大于等于 box1\n";return 0;}
    
  • 引入this:当我们调用成员函数时,实际上是替某个对象调用它。成员函数通过一个名为this的额外隐式参数来访问调用它的那个对象,当我们调用一个成员函数时,用请求该函数的对象地址初始化this。例如,如果调用total.isbn()则编译器负责把total的地址传递给isbn的隐式形参this,可以等价地认为编译器将该调用重写成了以下形式:
        //伪代码,用于说明调用成员函数的实际执行过程,其中,调用Sales_data类的isbn成员函数时传入了total对象的地址Sales_data::isbn(&total)
    
  • 在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无须通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看作是对this的隐式引用,也就是说,当isbn使用bookNo时,它隐式地使用this指向的成员,就像我们书写了 this->bookNo一样。对于我们来说,this形参是隐式定义的。实际上,任何自定义名为this的参数或变量的行为都是非法的。我们可以在成员函数体内部使用this,因此尽管没有必要,我们还是能把isbn定义成如下形式:
        std::string isbn() const { return this->bookNo; }
    
  • 因为this的目的总是指向“这个”对象,所以this是一个常量指针,我们不允许改变this中保存的地址。
  • this指针实例2如下:
        class Rect{public:Rect(){;}~Rect(){;}Rect* get_address(){  // 指针函数,返回this的地址return this;}};// Rect* 定义指针p接受对象r1的get_address()成员函数的返回值,并打印Rect* p = r1.get_address();cout << "通过this指针来返回调用get_address()成员函数的对象r1的地址p = " << p << endl;p = r2.get_address();cout << "通过this指针来返回调用get_address()成员函数的对象r2的地址p = " << p << endl;
    

2.this指针的形象化理解

  • 关于C++中this指针的理解:当你进入一个房子后,你可以看到房子内的桌子、椅子、地板等;但是你看不到房子的全貌;对于类来说,你可以看到成员函数、成员变量,但你看不到实例本身,但是应用this可以让我们看到这个实例本身。class类就好比这座房子,this就好比一把钥匙,通过钥匙来打开了这座房子的门,那么里面的东西就随意你取用了。
  • 因为this作用域是在类的内部,自己声明一个类的时候,还不知道实例化对象的名字,所以用this来使用对象变量的自身。在非静态成员函数中,编译器在编译的时候加上this作为隐含形参,通过this来访问各个成员(即使你没有写上this指针)。

C++中的this指针相关推荐

  1. 在析构函数中delete this指针问题

    思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢? #include <iostream> using namespace std; class A{ pub ...

  2. 结构体中定义函数指针

    结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...

  3. 简单介绍C++中常量与指针

    在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的,所以这篇文章主要给大家介绍了关于C++中常量与指针的相关资料,需要的 ...

  4. c语言智能指针是什么,C ++中的智能指针

    原标题:C ++中的智能指针 考虑以下带有普通指针的简单C ++代码. MyClass *ptr = new MyClass(); ptr->doSomething(); // We must ...

  5. 【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

    文章目录 一.结构体中嵌套二级指针 1.结构体中嵌套二级指针 类型声明 2.为 结构体内的二级指针成员 分配内存 3.释放 结构体内的二级指针成员 内存 二.完整代码示例 一.结构体中嵌套二级指针 1 ...

  6. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

  7. 【C 语言】多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )

    文章目录 前言 一.在函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 ) 二.完整代码示例 前言 如果要 通过 函数形参 间接赋值 修改 nnn 级指针, 需要向函数中传入 n+1n + ...

  8. 【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )

    文章目录 一.直接修改 和 间接修改 指针变量 的值 二.在函数中 间接修改 指针变量 的值 三.在函数中 间接修改 外部变量 的原理 一.直接修改 和 间接修改 指针变量 的值 直接修改 指针变量 ...

  9. 标准库中的智能指针shared_ptr

    智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...

最新文章

  1. Glide执行流程总结
  2. rocktmq 消息延时清空_使用Kotlin+RocketMQ实现延时消息的示例代码
  3. VC10中的C++0x特性简介
  4. python编程培训多少钱-python编程培训多少钱?[python培训]
  5. IIS状态代码的含义
  6. 30秒清除你电脑中的垃圾(使你电脑急速如飞)
  7. java广告无限点击_什么是互联网广告,互联网广告的投放形式都有哪些?
  8. 2021牛客多校6 - Defend Your Country(点双缩点求割点)
  9. Google 机器学习应用的43条经验法则
  10. java 创建ppt文件怎么打开文件,JAVA读取PPT文件
  11. 低姿态生活,高境界做人
  12. 实验1 201521410028
  13. 如何提升代码的安全性 —— 代码混淆
  14. 计算机英语听力速记...,2019计算机考研英语听力速记技巧才是王道
  15. macOS如何刷新DNS缓存
  16. Crackme 25
  17. froglt教你使用色相环配色(原创理论)
  18. access操作mysql_Access数据库基础及应用(公选课) 第二章:Access2010数据库创建与操作...
  19. 阿里云心选“小眯眼摄像头”视频监控天猫精灵可控手机远程wifi高清
  20. java 金融面试题目_面试题 - java金融 - 博客园

热门文章

  1. Node.js模块系统
  2. Android系统广播大全
  3. Effective C++:条款33:避免遮掩继承而来的名称
  4. (用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正...
  5. 更新假设raw file(audio file format) How to convert endianness
  6. 论坛社区做推广要精心的策划
  7. 控制Open With菜单项的注册表键值
  8. Linux DHCP服务搭建
  9. MySQL基础篇:用户和权限管理
  10. 中国唯一一座没有高楼大厦的新一线城市,也太佛了吧