C++中的`this`指针详解

目录标题

    • 1. `this`指针的基础
      • 1.1 `this`指针的定义
      • 1.2 `this`指针的用途
    • 2. `this`指针的详细用法
      • 2.1 区分同名的成员和参数
      • 2.2 链式调用
      • 2.3 返回对象自身的地址
    • 3. `this`在特殊情况下的用途
      • 3.1 在构造函数中使用`this`
      • 3.2 与智能指针结合使用
    • 4. `this`指针的限制和注意事项
      • 4.1 静态成员函数中没有`this`指针
      • 4.2 `this`指针是常量指针
      • 4.3 `const`成员函数中的`this`指针
    • 5. 一个简单的示例
    • 6. 总结


在C++编程中,this指针是一个指向调用对象的指针。它是成员函数的隐式参数,用于访问调用它的对象的成员。

1. this指针的基础

1.1 this指针的定义

当一个非静态成员函数被调用时,编译器在幕后传递了一个隐藏的参数给函数,这个参数就是this指针。this指针包含了被调用的对象的地址。

class MyClass {
public:void Display() {std::cout << "MyClass的地址是: " << this << std::endl;}
};

在上面的例子中,当Display()函数被调用时,this指向调用它的MyClass对象。

1.2 this指针的用途

this指针通常在以下几种情况下使用:

  • 当参数名和成员变量名相同时,用来区分它们。
  • 在链式调用中返回对象的引用。
  • 当需要返回对象本身的地址时。

2. this指针的详细用法

2.1 区分同名的成员和参数

class MyClass {
private:int value;public:void SetValue(int value) {this->value = value; // 明确指定成员变量value}
};

使用this->value来指定我们要赋值的是成员变量value,而不是参数value

2.2 链式调用

this指针使得对象可以返回自身的引用,从而进行链式调用。

class MyClass {
private:int value;public:MyClass& SetValue(int value) {this->value = value;return *this; // 返回对象的引用}MyClass& Increment() {++this->value;return *this; // 返回对象的引用}void Display() {std::cout << "当前值: " << value << std::endl;}
};MyClass obj;
obj.SetValue(5).Increment().Display(); // 链式调用

2.3 返回对象自身的地址

在某些情况下,我们需要返回对象自己的地址。

class MyClass {
public:MyClass* GetPointer() {return this; // 返回当前对象的地址}
};

3. this在特殊情况下的用途

3.1 在构造函数中使用this

在构造函数中使用this指针可以获取对象自身的地址,但在构造函数中不能返回this指针,因为对象可能还没有完全构建。

class MyClass {
public:MyClass() {std::cout << "构造函数中的this指针: " << this << std::endl;}
};

3.2 与智能指针结合使用

在现代C++编程中,当与智能指针结合使用时,this必须谨慎使用,特别是在管理资源的对象中。

class MyClass : public std::enable_shared_from_this<MyClass> {
public:std::shared_ptr<MyClass> GetSharedPtr() {return shared_from_this(); // 使用enable_shared_from_this安全地获取this指针的shared_ptr}
};

4. this指针的限制和注意事项

4.1 静态成员函数中没有this指针

静态成员函数不属于任何对象,因此在静态成员函数内部没有this指针。

class MyClass {
public:static void StaticFunc() {// this无法使用,因为这是静态成员函数}
};

4.2 this指针是常量指针

this指针本身是一个常量指针,你不能改变this指针的值,即不能让它指向另一个对象。

4.3 const成员函数中的this指针

const成员函数中,this指针是指向常量的指针,表示它指向的对象不能被修改。

class MyClass {
public:void Display() const {// this->value = 5; // 错误!this是指向const的指针std::cout << "const函数中的this指针: " << this << std::endl;}
};

5. 一个简单的示例

当然,这里有一个简单的C++类示例,其中使用this指针来区分成员变量和函数参数:

#include <iostream>class Box {
private:int length;public:// 构造函数Box(int length) {this->length = length; // 使用 this 指针来区分成员变量和构造函数的参数}void setLength(int length) {this->length = length; // 使用 this 指针来区分成员变量和函数参数}int getLength() const {return length; // 这里可以直接使用 length,因为没有冲突}void display() const {std::cout << "Box length: " << length << std::endl; // 同上,没有冲突}// 函数用于展示 this 指针的地址void showAddress() const {std::cout << "The address of the current object (this): " << this << std::endl;}
};int main() {Box smallBox(10); // 创建 Box 对象,长度为 10smallBox.display(); // 输出: Box length: 10smallBox.showAddress(); // 输出: The address of the current object (this): [具体的地址]smallBox.setLength(20); // 更新 Box 对象的长度为 20smallBox.display(); // 输出: Box length: 20return 0;
}

在这个示例中,this指针用于在Box类的构造函数和setLength方法中区分成员变量length和函数的参数lengththis->length总是指向类成员length,而单独的length则指代函数参数。

同时,showAddress函数中使用this来打印当前对象的内存地址。注意,this在非静态成员函数中隐式可用,这意味着你不需要显式传递它到函数中。

6. 总结

this指针是C++中的一个重要概念,它提供了一个指向调用成员函数的对象的指针。this指针的作用多样,能够简化代码,提高可读性和维护性。了解this指针的正确用法对于编写健壮的C++代码至关重要。

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

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

相关文章

vue2 与vue3的差异汇总

Vue 2 与 Vue 3 之间存在多方面的差异&#xff0c;这些差异主要体现在性能、API设计、数据绑定、组件结构、以及生命周期等方面。以下是一些关键差异的汇总&#xff1a; 数据绑定与响应式系统 Vue 2 使用 Object.defineProperty 来实现数据的响应式&#xff0c;这意味着只有预…

系统架构设计师 - 计算机组成与体系结构(1)

计算机组成与体系结构 计算机组成与体系结构计算机结构 ★CPU 组成结构运算器组成控制器组成 计算机体系结构冯诺依曼结构哈弗结构 嵌入式芯片&#xff08;了解&#xff09; 存储系统 ★★★★概述Cache主存编址磁盘管理磁盘基本结构与存取过程磁盘优化分布存储磁盘管理 大家好…

数据挖掘(二)数据预处理

前言 基于国防科技大学 丁兆云老师的《数据挖掘》 数据挖掘 数据挖掘&#xff08;一&#xff09;数据类型与统计 2、数据预处理 2.1数据清理 缺失值处理&#xff1a; from sklearn.impute import SimpleImputer# 创建一个SimpleImputer对象&#xff0c;指定缺失值的处理策略…

Spring框架学习笔记(二):Spring IOC容器配置 Bean,分别基于XML配置bean 和 基于注解配置 bean

1 Spring 配置/管理 bean 介绍 Bean 管理包括两方面 &#xff1a;创建 bean 对象&#xff1b;给 bean 注入属性 Bean 配置方式&#xff1a;基于 xml 文件配置方式&#xff1b;基于注解方式 2 基于 XML 配置 bean 2.1 通过类型来获取 bean 方法&#xff1a;给getBean传入一…

从零开始学习MySQL 事务处理

事务处理与ACID特性 事务是数据库操作的基本单元&#xff0c;它确保一组操作要么全部成功&#xff0c;要么全部失败&#xff0c;以此来维护数据库的一致性。这四个字母缩写ACID代表了事务的四大特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;**&#xff1a;事务被…

无人机+三角翼:小摩托无人机技术详解

无人机与三角翼的结合&#xff0c;为航空领域带来了一种新型且独特的飞行器——“小摩托”无人机。这种无人机结合了无人机的灵活性和三角翼的飞行稳定性&#xff0c;成为了航空运动领域中的一款热门产品。以下是对“小摩托”无人机技术的详解&#xff1a; 1. 定义与特点&#…

MFC中关于CMutex类的学习

MFC中关于CMutex类的学习 最近在项目中要实现两个线程之间的同步&#xff0c;MFC中提供了4个类&#xff0c;分别是CMutex(互斥量)、CCriticalSection(临界区)、CEvent(事件对象)、CSemaphore(信号量)。有关这4个类的说明&#xff0c;大家可以参考微软官方文档&#xff1a; CM…

七、Redis三种高级数据结构-HyperLogLog

Redis HyperLogLog是用来做基数统计的算法&#xff0c;HyperLogLog在优点是&#xff0c;在输入的元素的数量或者体积非常大时&#xff0c;计算基数占用的空间总是固定的、并且非常小。在Redis里每个HyperLogLog键只需花费12KB内存&#xff0c;就可以计算接近 264 个元素的基数。…

#04 构建您的第一个神经网络:PyTorch入门指南

文章目录 前言理论基础神经网络层的组成前向传播与反向传播 神经网络设计步骤1&#xff1a;准备数据集步骤2&#xff1a;构建模型步骤3&#xff1a;定义损失函数和优化器步骤4&#xff1a;训练模型步骤5&#xff1a;评估模型结论 前言 在过去的几天里&#xff0c;我们深入了解了…

头歌实践教学平台:CG1-v2.0-直线绘制

第1关&#xff1a;直线光栅化-DDA画线算法 一.任务描述 1.本关任务 (1)根据直线DDA算法补全line函数&#xff0c;其中直线斜率0<k<1&#xff1b; (2)当直线方程恰好经过P(x,y)和T(x,y1)的中点M时&#xff0c;统一选取直线上方的T点为显示的像素点。 2.输入 (1)直线两…

使用com.google.common.collect依赖包中的Lists.transform()方法转换集合对象之后,修改集合中的对象属性,发现不生效

目录 1.1、错误描述 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;模拟代码 &#xff08;3&#xff09;运行结果 1.2、解决方案 1.1、错误描述 最近在开发过程中&#xff0c;使用到了com.google.common.collect依赖包&#xff0c;通过这个依赖包中提供的…

Vue踩坑,less与less-loader安装,版本不一致

无脑通过npm i less -D安装less之后&#xff0c;继续无脑通过npm i less-loader -D安装less-loader出现如下错误&#xff1a; 解决方法&#xff1a; 1) npm uninstall less与 npm uninstall less-loader 2) 直接对其版本&#xff1a; npm i less3.0.4 -D npm i less-loader…

conda删除虚拟环境命令

conda删除虚拟环境命令 删除虚拟环境的命令可以使用conda命令的remove或者env remove子命令&#xff0c;具体的实现方法如下所示&#xff1a; 使用conda remove命令删除虚拟环境&#xff1a; conda remove --name <环境名称> --all 这将删除指定名称的虚拟环境…

Python进阶之-inspect模块详解

✨前言&#xff1a; Python中的inspect模块是用于获取对象的信息的模块&#xff0c;比如查看源代码、列出成员、检查类和函数的参数等&#xff0c;非常适用于调试和反射&#xff08;introspection&#xff09;。接下来&#xff0c;我会详细解释inspect模块&#xff0c;并结合例…

es关闭开启除了系统索引以外的所有索引

1、es 开启 “删除或关闭时索引名称支持通配符” 功能 2、kibanan平台执行 POST *,-.*/_close 关闭索引POST *,-.*/_open 打开索引3、其他命令 DELETE index_* // 按通配符删除以index_开头的索引 DELETE _all // 删除全部索引 DELETE *,-.* 删除全…

鸿蒙OpenHarmony开发板解析:【系统能力配置规则】

如何按需配置部件的系统能力 SysCap&#xff08;SystemCapability&#xff0c;系统能力&#xff09;是部件向开发者提供的接口的集合。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 部件配置系统…

Java入门——类和对象(上)

经读者反映与笔者考虑&#xff0c;近期以及往后内容更新将主要以java为主&#xff0c;望读者周知、见谅。 类与对象是什么&#xff1f; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 JAVA是基于面向对…

c#文心接口应用举例

"文心接口" 通常不是 C# 语言或生态系统中直接的一个术语&#xff0c;但我猜你可能是在提及百度的一个AI平台或API&#xff0c;比如百度的文心一言&#xff08;ERNIE Bot&#xff09;或其他与AI和NLP&#xff08;自然语言处理&#xff09;相关的服务。由于具体的文心…

DDOS攻击实战演示,一次DDOS的成本有多低?

DDoS攻击成本概览 分布式拒绝服务&#xff08;DDoS&#xff09;攻击以其低廉的启动成本和惊人的破坏力著称。攻击者通过黑市轻松获取服务&#xff0c;成本从几十元人民币的小额支出到针对大型目标的数千乃至数万元不等。为了具体理解这一成本结构&#xff0c;我们将通过一个简…

机器学习【如何学习】

如何学习机器学习 机器学习是一门快速发展的学科&#xff0c;学习机器学习需要掌握一定的数据基础和编程能力。但是很多人一听到数学就头大&#xff0c;就退缩&#xff0c;导致想要学习的新已经有两三年了&#xff0c; 但是学习的行动一直在心里&#xff0c;迟迟没有落地&…