浅析this指针

浅析this指针

文章目录

  • 浅析this指针
    • 前言
    • this指针作用
    • this指针使用
    • 注意事项
    • 总结

前言

​ 在面向对象的编程语言中,this指针是一个自引用指针,通常用于指向对象自身。通过这篇文章,我们将探讨this指针的核心特性、应用场景和相关案例。


this指针作用

  • 一个对象的this指针并不是对象本身的一部分,不会影响 sizeof(对象) 的结果。

  • this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

首先我们验证:this指针并不是对象本身的一部分

namespace test1
{class A{public:A(int val = 0):m_val(val){}private:int m_val;};void test(){cout << "size of A object = " << sizeof(A) << endl;		// 4}
}

如果 this 指针归属于类A所产生的对象,那么 sizeof(A) 得到的结果注定大于4,所以验证了 this 指针并不是对象本身的一部分。

其次验证:编译器会自动将对象本身的地址(this指针)作为一个隐含参数传递给函数

namespace test2
{class Person{public:Person(const string& name, int age = 0):m_age(age), m_name(name){}// 注意下面两个 getAge() 函数可以构成重载int getAge(){cout << "Non-const getAge()" << endl;return m_age;}int getAge()const{cout << "Const getAge()" << endl;return m_age;}private:int m_age;string m_name;};void test(){Person man1("zoufeng");const Person man2("zoufeng");man1.getAge();man2.getAge();}
}

运行结果:

在这里插入图片描述

我们注意思考一个问题,为什么上面案例代码中的两个 getAge() 函数可以构成重载,表象上看函数参数、函数名全都一致,为什么编译器没有报错呢?如果细心会看到第二个 getAge() 函数后面有 const 关键字修饰,正如我们所知 const 修饰成员函数可以避免函数内部修改类内成员变量,提供更高的安全性。而我们想到函数内修改类内成员变量值时正是出于 this 指针的引导才能找到自身对象所对应的成员变量,函数外部加 const 修饰就限制了修改,说明这个 const 本质上不是给函数修饰的,真正修饰的是作为传给非静态函数隐含参数的 this 指针!this 变为 const this 从而限制了函数内部的修改。

在这里插入图片描述

如果您对 const 修饰成员函数有疑问,参阅详见:C++之善用const修饰成员函数

this指针使用

(1)在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this。

(2)当参数与成员变量名相同时,如this->n = n (不能写成n = n)。

  • 链式操作: 通过返回*this, 可以连续调用当前对象上的其他方法。
class Person
{
public:Person(const string& name, int age = 0):m_age(age), m_name(name){}// ...Person& setAge(int age)		// 实现链式调用{this->m_age = age;return *this;}
private:int m_age;string m_name;
};void test()
{Person *man1 = new Person("zoufeng");cout << man1->getAge() << endl;cout << man1->setAge(100).getAge() << endl;		// 链式调用delete man1;
}

运行结果:

在这里插入图片描述

注意事项

​ 虽然 this 指针具有多种用途, 但也需要注意不要在构造函数和析构函数中返回*this。因为这样会导致对象的复制或者销毁,可能引发错误或者内存泄漏。


总结

this指针是 C++ 中一个重要的概念,它可以帮助我们更好地理解和使用类和对象。通过本文,我们了解了this指针的基本概念,案例分析,拓展知识和注意事项。希望这篇文章对你有所帮助,如果你有任何问题或者建议,欢迎留言或者联系我。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506551.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[GYCTF2020]EasyThinking --不会编程的崽

看标题就知道&#xff0c;这大概率是关于thinkphp的题目。先尝试错误目录使其报错查看版本号 thinkphp v6.0.0&#xff0c;在网上搜索一下&#xff0c;这个版本有一个任意文件上传漏洞。参考以下文章。 https://blog.csdn.net/god_zzZ/article/details/104275241 先注册一个账…

基于stm32F103的座面声控台灯

1.基本内容&#xff1a; 设计一个放置在桌面使用的台灯&#xff0c;使用220v交流电供电。具备显示屏能够实时显示日期&#xff08;年、月、日和星期&#xff09;&#xff0c;时间&#xff08;小时、分钟、秒&#xff09;和温度&#xff08;摄氏度&#xff09;&#xff1b;能够通…

JAVAEE初阶 JVM(二)

垃圾回收和双亲委派模型 1.双亲委派模型2.垃圾回收机制(1) 识别垃圾1.引用计数2.可达性分析 (2) 销毁垃圾1.标记清除2.复制算法3.标记整理 3.分代回收 1.双亲委派模型 描述了如何查找.class文件的策略. 同时JVM中有专门进行类加载的操作,有一个模块,叫做类加载器. 上述就是为了…

云原生架构技术揭秘:DevOps 技术打破开发运维壁垒,实现持续交付的变革之道

DevOps 是一套将软件开发&#xff08;Development&#xff0c;Dev&#xff09;和系统运维&#xff08;Operations&#xff0c;Ops&#xff09;相结合的实践&#xff0c;旨在缩短应用系统开发生命周期&#xff0c;提供高质量的持续交付。 —— 维基百科 DevOps 0、讲在前面 生…

STM32 HAL I2C使用

1、使用i2c的引脚要设置成开漏输出&#xff0c;以防止烧坏芯片。 2、开漏输出可以将驱动器中的P-MOS失能&#xff0c;只有N-MOS工作。防止如果有两个i2c外设&#xff0c;一个要输出高电平&#xff0c;一个要输出低电平而形成短路状态。 1、驱动oled屏幕 1.1、配置 对照原…

*JAVAWEB--maven*

一:介绍: maven是一种专门管理以及构建JAVA项目的一个工具,maven屹立这么久也是因为其有三个非常好用的功能: 1.提供标准化的项目结构 比方说平时我们编写JAVA项目的时候,如果想把原本在eclipse当中编写的项目导入到IDEA当中进行使用,就会导致报错,因为这两个的项目结构并不一样…

使用最新Hal库实现USART中断收发功能(STM32F4xx)

目录 概述 1 认识STM32F4XX的USART 1.1 USART 功能说明 1.2 USART的中断 1.3 USART 模式配置 1.4 USART的寄存器 2 使用STM32CubeMX 生成工程 2.1 配置参数 2.2 生成工程代码 3 实现软件功能 3.1 软件功能介绍 3.2 认识USART Hal库 3.2.1 初始化函数组 3.2.2 发送…

解决:Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

解决&#xff1a;Information:java: javacTask: 源发行版 8 需要目标发行版 1.8 先点击 Project Structure 查看jdk是否为1.8版本 我这jdk版本为1.8版本的&#xff0c;但还是运行还是报错 据以上错误显示以及上述配置&#xff0c;我选择的编译器是jdk1.8的&#xff0c;但是在i…

【Java基础系列】时间戳

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Yapi部署

【GO开发工程师】Yapi部署 推荐个人主页&#xff1a;席万里的个人空间 文章目录 【GO开发工程师】Yapi部署1、Yapi部署 1、Yapi部署 初始化yapi&#xff1a; git clone https://github.com/Ryan-Miao/docker-yapi.git cd docker-yapi docker-compose upyapi启动失败 1.cd进入…

【Scratch画图100例】图49-scratch绘制直角风车 少儿编程 scratch编程画图案例教程 考级比赛画图集训案例

目录 scratch绘制直角风车 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、实现流程 1、案例分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 …

【降维算法UMAP】调参获得更适合的低维图

目录 UMAP降维介绍 UMAP的主要步骤 1. 学习高维空间中数据点间的距离 2. 构建高维图 local_connectivity参数 n_neighbors参数 3. 构建低维图 计算最小距离 min_dist超参数 最小化成本函数 R语言中的RunUMAP函数 关键参数 Reference UMAP降维介绍 为什么要降维&am…