C++ this 指针到底是个什么特殊的指针

什么是 this 指针?

简单来说,this 指针是一个指向当前对象的指针。每个成员函数(除了静态成员函数)在被调用时,系统都会隐式地传递一个 this 指针给函数。通过 this 指针,成员函数可以访问调用它的那个对象的成员变量和成员函数。

this 指针的基本用法

我们先来看一个简单的例子,帮助大家理解 this 指针的基本用法:

class Example {private:    int value;public:    void setValue(int value) {        this->value = value; // 使用 this 指针区分成员变量和参数    }    int getValue() {        return this->value;    }};

int main() {    Example ex;    ex.setValue(42);    std::cout << "Value: " << ex.getValue() << std::endl;    return 0;}

在上述代码中,setValue 函数中的 this->value 表示当前对象的成员变量 value。由于参数和成员变量同名,我们需要用 this 指针来明确表示我们要操作的是成员变量,而不是函数参数。

为什么需要 this 指针?

this 指针在以下几种情况下尤为重要:

    1    区分成员变量和参数:当成员变量和函数参数同名时,使用 this 指针可以避免混淆。

    2    返回对象自身:在实现链式调用时,我们可以通过 this 指针返回对象本身。例如:

    3    class Example {public:    Example& setValue(int value) {        this->value = value;        return *this;    }};

    4    int main() {    Example ex;    ex.setValue(10).setValue(20); // 链式调用    return 0;}

上述代码中的 setValue 函数返回了 *this,即当前对象的引用,使得我们可以进行链式调用。

    5    运算符重载:在运算符重载函数中,this 指针也很常用。例如,重载赋值运算符时,我们需要处理自我赋值的情况:

 

class Example {private:    int value;public:    Example& operator=(const Example& other) {        if (this == &other) {            return *this; // 防止自我赋值        }        this->value = other.value;        return *this;    }};

4. 指向当前对象:在一些需要返回当前对象地址的情况下,例如实现克隆功能时,我们可以使用 this 指针:

class Example {public:    Example* clone() {        return new Example(*this);    }};

 

this 指针的高级用法

除了基本用法,this 指针还有一些高级用法,例如在继承和多态中的应用。

在继承中的应用

在继承关系中,this 指针同样指向当前对象,但这个对象可能是派生类的对象。例如:

 

class Base {public:    void show() {        std::cout << "Base show()" << std::endl;    }};

class Derived : public Base {public:    void show() {        std::cout << "Derived show()" << std::endl;    }    void callBaseShow() {        this->Base::show(); // 调用基类的 show() 函数    }};

int main() {    Derived d;    d.show(); // 输出 "Derived show()"    d.callBaseShow(); // 输出 "Base show()"    return 0;}

在上述代码中,callBaseShow 函数使用 this->Base::show() 调用了基类的 show 函数。这种方式可以让我们在派生类中访问基类的成员。

在多态中的应用

在多态情况下,this 指针也能帮助我们正确地调用对象的成员函数。例如:

 

class Base {public:    virtual void show() {        std::cout << "Base show()" << std::endl;    }};

class Derived : public Base {public:    void show() override {        std::cout << "Derived show()" << std::endl;    }};

void display(Base* obj) {    obj->show();}

int main() {    Base b;    Derived d;    display(&b); // 输出 "Base show()"    display(&d); // 输出 "Derived show()"    return 0;}

在上述代码中,通过将派生类对象的地址传递给 display 函数,我们能够利用多态特性正确地调用派生类的 show 函数。

this 指针的限制

尽管 this 指针在 C++ 中非常有用,但它也有一些限制:

    1    静态成员函数:this 指针不能在静态成员函数中使用,因为静态成员函数不属于任何特定对象。

    2    常量成员函数:在常量成员函数中,this 指针的类型是 const,因此不能修改对象的成员变量。例如:

 

class Example {private:    int value;public:    void setValue(int value) const {        // this->value = value; // 错误:不能修改常量成员函数中的成员变量    }};

 

总结

通过这篇文章,我们详细介绍了 C++ 中 this 指针的概念、基本用法和高级用法。作为一个指向当前对象的特殊指针,this 指针在成员函数、运算符重载、继承和多态等多个场景中都发挥了重要作用。

在实际开发中,正确理解和使用 this 指针可以帮助我们写出更加清晰和高效的代码。同时,掌握 this 指针的高级用法也能让我们在处理复杂的面向对象编程问题时更加得心应手。

 

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

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

相关文章

ROS melodic版本卸载---Ubuntu18.04

sudo apt-get remove ros-melodic-desktop-fullsudo apt-get remove gazebo* 删除依赖关系 sudo apt autoremove删除与ros关联的所有文件 sudo apt-get purge ros-* sudo rm -rf /etc/ros找到.bashrc文件删除含ros的环境配置语句 全部删除完毕&#xff0c;可以去计算机下的…

Allegro SPB 简介

系统互联设计优化并加速了高性能&#xff0c;高密度的互连设计&#xff0c;建立了从IC制造&#xff0c;封装到PCB的一套完整设计流程。 系统互连是一个信号的逻辑&#xff0c;物理和电气连接&#xff0c;以及相应的回路和功率配送系统。 1.对PCB板级的电路系统设计流程: 包括…

python项目实战——一元线性回归预测模型

文章目录 1.一元线性回归简介2.环境准备3.数据准备4.可视化数据5.构建线性回归模型 在数据科学领域&#xff0c;预测分析是一项核心技能。一元线性回归作为预测分析的基石&#xff0c;能够帮助我们理解一个自变量如何影响一个因变量&#xff0c;并预测未来的数据点。本文将介绍…

解决onlyoffice警告的一些思路

解决思路&#xff1a; 1、监听出现警告的事件&#xff1a;已经实现 <script setup> import {message} from "ant-design-vue";const onError (event) > {console.log("ONLYOFFICE Document Editor reports an error: code " event.data.error…

干货 | 2024云安全责任共担模型(免费下载)

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a;

VO,DTO,PO快速问答,看完这篇就能理解上手!

在实际开发中&#xff0c;通常实体类domain中就有很多类型&#xff0c;这些类型之间的相互转换也是不太好理解&#xff0c;在这里我整理了一些他们之间互相转换的问题&#xff0c;以问答形式&#xff0c;帮助大家更好的理解&#xff01; 问题1&#xff1a;在 Java 开发中&#…

基于Java技术的人事管理系统

你好&#xff0c;我是专注于计算机科学领域的小野。如果你对人事管理系统感兴趣或有相关需求&#xff0c;欢迎私信交流。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; B/S模式、Java技术、SpringBoot 工具&#xff1a; Eclipse、MySQL、浏览…

第四届BPAA算法大赛成功举办!共研算法未来

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

kubernetes集群部署:node节点部署和cri-docker运行时安装(四)

安装前准备 同《kubernetes集群部署&#xff1a;环境准备及master节点部署&#xff08;二&#xff09;》 安装cri-docker 在 Kubernetes 1.20 版本之前&#xff0c;Docker 是 Kubernetes 默认的容器运行时。然而&#xff0c;Kubernetes 社区决定在 Kubernetes 1.20 及以后的…

【C++】开源:量化金融计算库QuantLib配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍量化交易库QuantLib配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#…

Java中的数据可视化与图表库选择

Java中的数据可视化与图表库选择 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代软件开发中&#xff0c;数据可视化是将抽象数据转化为易于理解的图形化…

【JVM基础篇】Java垃圾回收器介绍

垃圾回收器&#xff08;垃圾回收算法实现&#xff09; 垃圾回收器是垃圾回收算法的具体实现。由于垃圾回收器分为年轻代和老年代&#xff0c;除了G1&#xff08;既能管控新生代&#xff0c;也可以管控老年代&#xff09;之外&#xff0c;新生代、老年代的垃圾回收器必须按照ho…

Redis中list类型操作命令(操作演示、命令语法、返回值、时间复杂度、注意事项等)

文章目录 lpush 命令lrange 命令lpushx 命令rpush 命令rpushx 命令lpop 命令rpop 命令lindex 命令linsert 命令llen 命令lrem 命令ltrim 命令lset 命令blpop 和 brpop lpush 命令 从左侧向列表中插入指定的元素 语法&#xff1a;lpush key value [value……] 时间复杂度&#…

【C语言】自定义类型:联合和枚举

前言 前面我们学习了一种自定义类型&#xff0c;结构体&#xff0c;现在我们学习另外两种自定义类型&#xff0c;联合 和 枚举。 目录 一、联合体 1. 联合体类型的声明 2. 联合体的特点 3. 相同成员联合体和结构体对比 4. 联合体大小的计算 5. 用联合体判断当前机…

C语言实现顺序表字符型数据排序

实现直接插入、冒泡、直接选择排序算法。 #include <stdio.h> #include <stdlib.h>typedef char InfoType;#define n 10 //假设的文件长度&#xff0c;即待排序的记录数目 typedef char KeyType; //假设的关键字类型 typedef struct { //记录类型KeyType…

vue3+vite搭建第一个cesium项目详细步骤及环境配置(附源码)

文章目录 1.创建vuevite项目2.安装 Cesium2.1 安装cesium2.2 安装vite-plugin-cesium插件&#xff08;非必选&#xff09;2.3 新建组件页面map.vue2.4 加载地图 3.完成效果图 1.创建vuevite项目 打开cmd窗口执行以下命令&#xff1a;cesium-vue-app是你的项目名称 npm create…

【LeetCode:3101. 交替子数组计数 + 滑动窗口 + 数学公式】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

转盘输入法-键盘加鼠标版本

序 转盘输入法&#xff0c;给你的聊天加点新意。它不用常见的九宫格或全键盘&#xff0c;而是把字母摆在圆盘上&#xff0c;一滑一滑&#xff0c;字就出来了&#xff0c;新鲜又直接。 键盘加鼠标版本GIF演示 演示软件下载 转盘输入法PC演示版本EXE下载https://download.csdn…

Unity编辑器扩展之Inspector面板扩展

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity编辑器扩展之Inspector面板扩展 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff…

MySQL主从复制_腾讯云

腾讯云-CVM自建基于GTID复制的mysql作为CDB的从库 腾讯云MySQL主库SQL操作 # 查看log_bin日志是否启动成功 SHOW VARIABLES LIKE %log_bin%;# 查看主库是否开启了GTID功能 SHOW GLOBAL VARIABLES LIKE %gtid_mode%; # 创建用户并授权 mysql> CREATE USER user_repl % IDENT…