C++基础#4:this指针的用法-何时显示引用与隐式引用

深入C++对象模型与this指针:内存布局、虚函数与性能优化 在C++编程中,理解对象的内存布局是掌握面向对象核心机制的关键。对象模型定义了编译器如何将类成员映射到内存,涉及内存对齐、成员排列等底层原理,直接影响程序的内存使用效率和缓存局部性。通过虚函数表(vtable)和虚函数指针(vptr)实现的多态机制,是C++运行时动态绑定的技术基础,为设计灵活可扩展的软件架构提供了支持。在工程实践中,合理利用空基类优化(EBO)、避免对象切片、正确使用this指针与智能指针,能显著提升代码的健壮性和性能。本文结合C++对象模型和this指针的深度解析,通过内存布局分析、调试 阅读详情

1. this指针的含义及其用法: 
(1). this指针是一个隐含于每一个成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。
(2). 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。
(3). 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
(4). 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;
   在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);

(5). 由于this并不是一个常规变量,所以,不能取得this的地址。
(6). 在以下场景中,经常需要显式引用this指针
   (1) 为实现对象的链式引用(如例1);
   (2) 为避免对同一对象进行赋值操作(如例2);

   (3) 在实现一些数据结构时,如list.

 

2. 举例:

(1)例1:为实现对象的链式引用,需要显式引用this指针:

//例1:

/*  编辑编译环境:Dev-C++ 4.9.9.2  */
/*  file: person.cpp */



#include <stdio.h>
#include <string.h>

class Person {
      public:
          typedef enum {
                 BOY = 0,
                 GIRL = !BOY
          } SexType;
      public:
             Person(char *n, int a, SexType s)
             {
                 name = new char[strlen(n)+1];  //这里的 name 等价于this->name
                 strcpy(name,n);                //这里的 name 等价于this->name
                 age = a;                       //这里的 age 等价于this->age
                 sex = s;                       //这里的 sex 等价于this->sex
             }
             int get_age(void) const
             {
                 //age++; //compile error, 因为 age等价于this->age,而 get_age又是一个const成员函数,
                        //不能对 this指针所指向的这种对象进行修改,这也是const的一个作用。
                        //这样做的好处是,增加了代码的健壮性。
                 return age;
             }
             Person& add_age(int a)
             {
                 age +=a;
                 return *this; // 返回本对象的引用
             }
      private:
            char *name;
            int age;
            SexType sex;
};

void TestPerson(void)
{
     Person ZhangSan("ZhangSan", 20, Person::BOY);
     printf("ZhangSan.age = %d/n", ZhangSan.get_age());
     printf("ZhangSan.add_age = %d/n", ZhangSan.add_age(1).get_age()); //增加1岁的同时,可以对新的年龄直接输出;

     return;
}         

int main(void)
{
    TestPerson();
    while(1);
   
}

/* result:
   ZhangSan.age = 20
   ZhangSan.add_age = 21
*/

代码说明:

//age++; compile error,

编译错误,因为 age等价于this->age,而 get_age又是一个const成员函数,C++不允许对 this指针所指向的这种对象进行修改,这也是const的一个作用。

 这样做的好处是,增加了代码的健壮性。

 

(2)例2:为避免对同一对象进行赋值操作,显示引用this指针。

//例2:

/*  编辑编译环境:Dev-C++ 4.9.9.2  */
/* file: location.cpp */

#include <stdio.h>

class Location {
     int X,Y;//默认为私有的
 public:
     void init(int x,int y) { X =x; Y = y;};
     void assign(Location& pointer);
     int GetX(){ return X; }
     int GetY(){ return Y; }
};

void Location::assign(Location& pointer)
{
    if(&pointer!=this) //同一对象之间的赋值没有意义,所以要保证pointer不等于this
    {
        X=pointer.X;
        Y=pointer.Y;
    }
}

int main()
{
     Location x;
     x.init(5,4);
    
     Location y;
     y.assign(x);
    
     printf("x.X = %d, x.Y = %d /n",  x.GetX(), x.GetY());
     printf("y.X = %d, y.Y = %d ",  y.GetX(), y.GetY());
    
     while(1);
     return 0;
}
/* result:
   x.X = 5, x.Y = 4
   y.X = 5, y.Y = 4
*/

 

【WRF-DART第一期】WRF/DART概述 阅读详情

相关推荐

基于继电器与三极管的自动水泵控制器DIY:从电路原理到PCB制作实战

继电器作为一种利用电磁原理实现电路通断控制的电气开关,其核心价值在于通过小电流信号控制大电流负载,实现强弱电之间的安全隔离。在自动化控制领域,继电器常与三极管等半导体器件配合,构成驱动电路,将微弱的传感器信号放大,从而可靠地控制电机、水泵等执行机构。这种组合技术广泛应用于工业控制、智能家居及各类电子DIY项目中,例如实现水箱水位的自动检测与控制。本文将以一个典型的自动水泵控制器项目为例,深入剖析如何利用继电器与三极管搭建水位检测与驱动电路,并详细讲解从电路设计、PCB自制(热转印法)到系统调试的完整工程实践

weixin_31774841的博客 346

this指针

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

每天学习一点点,成长一小步 961

Dify沙盒容器部署实战:解决config.yaml缺失与系统调用权限问题

本文详细解析了Dify沙盒容器部署中的两大常见问题:config.yaml缺失与系统调用权限限制。通过实战步骤指导如何正确配置卷挂载解决`no such file or directory`错误,并深入讲解如何调整`allowed_syscalls`白名单应对`error: operation not permitted`权限问题,帮助开发者高效完成Dify容器化部署。

gg901的博客 921

菜鸟自学嵌入式之C++No1     this指针专题

这周看C++ 的东西,总感觉this指针理解的不深入。感觉我懂又不太懂的样子。在网上整理了一些资料。感觉理解的稍微透彻一点点了涅。1. this指针的用处:  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就...

weixin_34239592的博客 707

Arduino Nano + MCP3422A0 ADC 毫欧表:3档分辨率(0.1mΩ-1.3kΩ)开尔文连接实测

本文详细介绍了如何使用Arduino Nano与MCP3422A0 ADC构建高精度毫欧表,采用四线制开尔文连接和三档量程设计,实现0.1mΩ-1.3kΩ的精确测量。通过精密恒流源和18位ADC技术,结合智能量程切换和数字滤波算法,显著提升测量精度和稳定性,适用于电子维修、PCB测试等场景。

weixin_28292761的博客 323

FPGA网络调试实战:基于88E1111和DP83867两款PHY芯片的SGMII-UDP数据回环对比与避坑指南

本文深入对比了88E1111与DP83867两款PHY芯片在SGMII-UDP数据回环中的性能差异,涵盖硬件设计、Vivado工程配置及调试技巧。通过实测数据揭示DP83867在吞吐量、延迟和功耗方面的优势,并提供FPGA网络调试中的常见问题解决方案,助力工程师高效完成项目开发。

weixin_31682031的博客 383

C++“this”指针的使用

即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。换句话说就是,及时你没有用this指针,编译器在编译的时候也会自动加上this的,它是一个隐含形参,对各成员的访问 均通过this进行。是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。this不能显示在成员函数的形参中,但可以在成员函数中使用。

weixin_66828150的博客 1303

Oracle 从入门到精通系列(入门篇)1.1-Oracle 数据库发展史

Oracle 从入门到精通系列(入门篇)1.1-Oracle 数据库发展史

LuciferLiu_DBA 2190

c++基础知识:this指针

this指针简介

qq_48335434的博客 4326

使用 Python 调用 GitHub REST API 爬取 GitHub 仓库信息(完整指南)

GitHub 提供了功能强大的 REST API,允许开发者通过编程方式访问 GitHub 上的仓库、用户、提交记录、PR(Pull Request)等信息。GitHub REST API 是 GitHub 官方提供的 API 接口,支持通过 HTTP 请求来操作 GitHub 上的资源。在本文中,我们将使用 Python 编写一个完整的爬虫程序,调用 GitHub 的 REST API 来爬取 GitHub 仓库的信息。目前 GitHub 使用的主要是 v3 版本的 REST API。

2201_76125261的博客 1110

华为OD机试真题 Java&Go 实现【优雅子数组】【100%通过率】【2022.11 Q4 新题】

如果一个数组中出现次数最多的元素出现大于等于K次,被称为K -优雅数组,k也可以被称为优雅阈值。例如,数组1,2,3,1、2,3,1,它是一个3-优雅数组,因为元素1出现次数大于等于3次,数组1,2,3,1,2就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。

MISAYAONE的博客 1万+

C++ this指针的使用与详解

C++ this指针的使用与详解

qq_35320456的博客 1064

VAY 是 SAP 自动科目确定(OBYC-GBB)中的科目修改码,专用于带科目分配对象的销售订单发货场景,核心是触发 “Dr 成本要素科目(如销售费用 / 特定成本对象) Cr 库存商品” 的分录,

摘要:VAY是SAP中用于带科目分配对象(如成本中心、WBS)的销售订单发货的科目修改码,与标准VAX场景不同,它生成"借成本要素科目/贷库存商品"的分录。配置路径为OBYC-GBB-VAY,需确保借方科目为成本要素。典型业务场景包括免费样品、项目专用发货等。常见问题包括VAY未触发或科目记账错误,需检查销售订单科目分配、移动类型设置及OBYC配置。特殊场景建议单独配置科目以便费用分析。

金牌架构师 1253

【C++初阶#4】类、this指针

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号// 默认为私有 无法从外部访问class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理public://属性//半径int m_r;//行为//获取圆的周长。

island1314的博客 1212

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

窥视C++细节-类成员函数的隐式参数this

文章目录环境栈帧-示例类成员函数的调用类成员函数的汇编代码 环境 https://godbolt.org/,这个网站可以方便的将C++代码编译成汇编,同时使用颜色标识某条C++语句对应的汇编代码。 在使用之前需要可以根据自己的习惯配置一下。 使用的gcc版本是10.2 -m32:将C++代码编译成32位的汇编 -O0:不要进行编译优化 Intel asm syntax:编译成intel格式的汇编,默认是AT&T格式的汇编。 Demangle identifiers:反命名倾轧,在汇编代码中使用C+

专注音视频基础、WebRTC、ffmpeg、流媒体服务器 1125

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++中this指针的用法.

this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: void Date::setMonth( int mn ) { month = mn; // 这三句是等价的 this-&gt;month = mn; (*this).month = mn; } 1. this只能在成员函数中使用。 全局函数,静态函数都不能使用this。 实际上,成员函数默认第一个参数为T* c...

sym19862006的专栏 1074

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

c++中的this指针

C++中的this指针(1)       this指针是什么:对于类,类的成员函数具有一个附加的隐含形参,即指向该类对象的一个指针。隐含形参命名为this,与调用成员函数的对象绑定在一起。成员函数不能定义this形参,而是由编译器隐含定义的。成员函数的函数体可以显示的使用this指针(访问数据成员),但是一般不必这么做。编译器在编译的时候会自动加上this指针,比如:object.pr

。。。。 1547

C++模板实例化:从隐式到显式,掌握编译加速与代码控制

C++模板是泛型编程的核心,它允许编写与类型无关的通用代码。其工作原理是编译器根据使用时的具体类型,将模板“蓝图”生成实际的函数或类代码,这一过程称为实例化。默认的隐式实例化模式虽然方便,但会导致编译时代码膨胀和编译时间延长,尤其在大型项目或模板库中影响显著。为了优化编译效率和实现更好的工程控制,C++提供了显式实例化机制。通过显式实例化定义,开发者可以集中、一次性生成特定类型的模板代码;配合C++11引入的extern template声明,则可以抑制其他编译单元的重复实例化,直接链接预编译好的版本。这项

weixin_33860528的博客 434

C++ this指针的理解和作用

01 C++ 程序到 C 程序的翻译 要想理解 C++ 的 this 指针,我们先把下面的 C++ 代码转换成 C 的代码 class Car { public: int m_price; // 成员变量 void SetPrice(int p) // 成员函数 { m_price = p; } }; int main() { Car car; car....

小林coding 2222

C++ this指针详解

this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: ​ void Date::setMonth( int mn ) { month = mn; // 这三句是等价的 this->month = mn; (*this).month = mn; } ​ 1. this只能在成员函数中使用。 ...

请叫我皮皮虾的博客 1106

C++ class 中隐含的this指针

this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子:       void Date::setMonth( int mn )       {        month = mn; // 这三句是等价的        this->month = mn;        (*this).month = mn;       }     1. this只能在成员函

3600

this指针用法

<br /> this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: <br />    void Date::setMonth( int mn ) <br />    { <br />     month = mn; // 这三句是等价的 <br />     this->month = mn; <br />     (*this).month = mn; <br />    } <br />1. this只能在成员函数中使用。<br />全局函数,静态函数都不能使用this。<

Seanyxie Blog 1126

C++中this指针的用法

this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: void Date::setMonth( int mn ) { month = mn; // 这三句是等价的 this->month = mn; (*this).month = mn; } 1. this只能在成员...

Andy_chen1990的博客 191

5个关键场景揭示成员函数指针的this绑定奥秘

掌握成员函数指针的 this 绑定,解决C++类成员函数调用难题。涵盖多态回调、函数对象、绑定优化等5大关键场景,深入解析this指针绑定机制与性能优势。理解底层原理,提升代码灵活性与效率,值得收藏。

AlgoChat的博客 266

this 指针

什么是 this 指针? C++this指针,一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。 this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候, 编译器会自动将对象本身的地址作为一个隐含参数传递给函数。 this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中, 指向被调用函数所在的对象。全局仅有一个this指针...

快乐星球 1093
上一篇: 王传福以350亿元登顶中国首富
下一篇: Android 启动过程
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值