【C++掌中宝】类和对象(二):隐藏的this指针

news2024/9/30 10:58:47

在这里插入图片描述

文章目录

  • 引言
  • 1. 定义与用法
    • 1.1 隐式存在的 this 指针
    • 1.2 this 指针的用途与示例
  • 2. 本质
  • 3. 特点
  • 4. this 指针的作用机制
  • 5. 成员函数中的 this 指针
  • 6. 空指针与 this 指针的特殊情况
  • 7. 注意事项
  • 8. 总结
  • 结语

引言

在 C++ 编程中,类是面向对象编程的核心,而类中的成员函数与对象的交互则通过一个隐含的指针来实现,这就是 this 指针。它在 C++ 类的非静态成员函数中自动存在并指向调用该函数的对象实例。在这篇文章中,我们将详细探讨 this 指针的定义、用法以及其背后的工作原理。

1. 定义与用法

1.1 隐式存在的 this 指针

在 C++ 中,每个非静态成员函数都会隐式包含一个 this 指针,它指向调用该成员函数的对象实例。对于开发者来说,this 指针无需显式声明或传递,它由编译器自动管理。

1.2 this 指针的用途与示例

this 指针最常见的用途是解决成员变量与函数参数同名的问题,此外它还可以用于在成员函数中返回对象本身。例如:

class Person {
public:
    Person(int age) {
        this->age = age;  // 用 this 指针区分成员变量和参数
    }

    Person& addAge(int age) {
        this->age += age;
        return *this;  // 返回对象本身
    }

    int age;
};

在上面的代码中,当函数的参数 age 与类的成员变量 age 同名时,我们使用 this->age 来明确表示成员变量。另外,通过 return *this,我们可以在函数返回时返回调用该函数的对象,从而支持方法链调用。

2. 本质

this 指针的本质是一个常量指针,其类型为 ClassName* const,指向调用该成员函数的对象实例。它不可修改,即我们无法改变 this 指针指向的对象。

例如,当你调用 obj.SetValue(5) 时,实际上执行的函数是 SetValue(&obj, 5)this 指针指向了对象 obj,从而确保函数操作的是正确的对象。

3. 特点

  1. 只能在非静态成员函数中使用:全局函数和静态成员函数中都无法使用 this 指针。
  2. 生命周期与成员函数一致this 指针在成员函数调用时被创建,并在函数执行结束时销毁。
  3. 存储位置因编译器而异this 指针可能存储在栈、寄存器或全局变量中,具体取决于编译器的实现。

4. this 指针的作用机制

为了深入理解 this 指针的作用,我们可以将 C++ 代码转换为 C 代码。在 C 语言中,没有类的概念,但我们可以用结构体和全局函数来模拟类和成员函数:

struct Car {
    int price;
};

void SetPrice(struct Car* this, int price) {
    this->price = price;
}

int main() {
    struct Car car;
    SetPrice(&car, 20000);
    return 0;
}

上面的 C 代码模拟了 C++ 的类机制,其中 SetPrice 函数需要传入 Car 结构体的指针才能访问其成员变量。这就相当于 C++ 中 this 指针的工作方式。

5. 成员函数中的 this 指针

非静态成员函数中默认会包含 this 指针。例如,在成员函数中调用其他成员函数或访问成员变量时,编译器实际上是通过 this 指针来完成的:

class Car {
public:
    int price;

    void setPrice(int p) {
        this->price = p;  // this 指向调用该函数的对象
    }
};

6. 空指针与 this 指针的特殊情况

在某些极端情况下,this 指针可能为空。例如,当我们通过空指针调用一个没有访问成员变量的成员函数时,程序不会崩溃

class A {
public:
    void sayHello() { std::cout << "Hello" << std::endl; }
};

int main() {
    A* ptr = nullptr;
    ptr->sayHello();  // 输出 "Hello"
}

因为前一篇文章我们说过成员函数地址是编译时确定的,不是存在对象里面的,而是单独存在一个代码段里,所以这里面没有解引用

然而,如果该成员函数访问了成员变量,程序将崩溃,因为 this 指针为空,指向了非法内存区域。

7. 注意事项

  • 静态成员函数无法使用 this 指针,因为它们属于类本身,而不是类的具体实例。因此,静态成员函数无法访问非静态成员变量。
  • C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。

8. 总结

this 指针是 C++ 中的一个重要机制,帮助成员函数与对象实例关联。它在类的成员函数内部自动存在,指向调用该函数的对象实例。通过掌握 this 指针的用法,开发者可以更好地理解面向对象编程的原理,并编写更加灵活和健壮的代码。

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!
在这里插入图片描述

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

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

相关文章

帆软报表替代产品有哪些?

帆软报表历经十余年的发展&#xff0c;功能极为强大。然而&#xff0c;其用户界面稍显老旧&#xff0c;使用过程也较为繁琐。近几年涌现出了一些相当优秀的报表工具。 1. 积木报表 特点&#xff1a;积木报表 JimuReport&#xff0c;是一款免费的数据可视化报表&#xff0c;含报…

基于SSM的少儿编程网上报名系统 【附源码】

基于SSM的少儿编程网上报名系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统的功能结构图 4.2 数据库概念结构设计 4.2.1 数据库E-R图 4.2.2 数据库逻辑结构设计 第五章 系统功能实现 5.1管理员功能模块 5.2用户功能模块 5…

【基础算法总结】分治--快排+归并

目录 一&#xff0c;分治算法介绍二&#xff0c;算法原理和代码实现75.颜色划分912.排序数组-快速排序215.数组中的第k个最大元素(快速选择算法)LCR159.最小的k个数(快速选择算法)912.排序数组-归并排序LCR170.数组中的逆序对315.计算右侧小于当前元素的个数493.翻转对 三&…

POLYGON Nature - Low Poly 3D Art by Synty 树木植物

一个低多边形资源包,包含可以添加到现有多边形风格游戏中的树木、植物、地形、岩石、道具和特效 FX 资源。 为 POLYGON 系列提供混合样式树这一新增功能。弥合 POLYGON 与更传统的层级资源之间的差距。还提供了一组经典的 POLYGON 风格的树木和植被以满足你的需求。 该包还附带…

Mac安装Manim并运行

1.在macOS上创建Python虚拟环境&#xff0c;可以使用venv模块&#xff0c;这是Python自带的库&#xff0c;也可以使用conda。以下是使用venv创建和使用Python虚拟环境的步骤&#xff1a; 打开终端。 创建一个新的目录来存放你的项目&#xff0c;并进入该目录&#xff1a; mk…

Spring Security中自定义cors配置

一、为什么要自定义cors配置 在使用Spring框架时&#xff0c;Spring Security组件提供了简便的cors配置方案&#xff0c;使程序开发者可以快速的实现“同源安全策略”。关于cors&#xff0c;可以参数之前的一篇文章--关于Spring Security的CORS_springsecurity cors-CSDN博客 由…

excel 处理数据的常用场景之考勤表的制作

文章目录 预备知识数据有效性excel的图表知识 考勤表效果图开始制作1. 首先我们去分析这个表格&#xff0c;我们把它分为三个部分如下&#xff1a;2. 开始第一个部分的制作3. 开始制作第二部分。4. 第三部分也是最复杂的&#xff0c;因为会用到几个公式&#xff0c;我这里下面会…

入职2年的程序员,被劝退了!年纪大了,感觉好绝望!

入职2年的程序员&#xff0c;今天被劝退了&#xff01;年纪大了&#xff0c;感觉好绝望&#xff01; 我的朋友是一位程序员&#xff0c;毕业后去了BAT企业&#xff0c;前2年去了一家国企&#xff0c;至今刚满2年&#xff0c;刚进去绩效领导给打了C&#xff0c;现在被边缘化&…

详解Java之继承与多态

目录 继承 派生类和基类各部分执行顺序 protected 访问权限总结 final关键字 组合 多态 向上转型 向下转型 动态绑定 静态绑定 方法重载 方法重写 super关键字 super和this的对比 在构造方法中调用重写方法 继承 继承是为了解决多个类具有一些相同的属性和方…

DotNetty ChannelRead接收数据为null

问题&#xff1a;C#使用Dotnetty和Java netty服务器通讯&#xff0c;结果能正确发送数据到服务器&#xff0c;却始终接收不到服务器返回的数据。 解决&#xff1a;一定一定要注意服务器和客户端使用的编码一定要完全一样才行 我先前在客户端添加了StringDecoder,服务器却没有…

AI如此迅猛,你还能跟上吗?快来试试这个对口型新神器!

国庆即将到来&#xff0c;宇航祝大家国庆节快乐&#xff01;最近感觉有些寒意了&#xff0c;气温忽高忽低的&#xff0c;大家一定要注意&#xff0c;别感冒了。 今天给大家分享一个即梦的新功能 : 对口型&#xff0c;也是最近即梦不声不响新上线的功能。 一、 功能介绍 即梦的…

【C++】多态(上)

个人主页~ 多态 一、多态的概念二、多态的定义以及实现1、多态的构成条件2、虚函数3、虚函数的重写虚函数重写的两个特殊情况①协变② 析构函数的重写 4、C11的override和final&#xff08;1&#xff09;final&#xff08;2&#xff09;override 5、重载、重写、隐藏的对比 三、…

普中51单片机

参考&#xff1a;51单片机快速入门教程2022&#xff08;普中51开发板A2新版&#xff09;--绍兴文理学院元培学院《单片机原理与应用》课程建设_哔哩哔哩_bilibili 1.以管理员启动&#xff0c;破解

【开源免费】基于SpringBoot+Vue.JS校园资料分享平台(JAVA毕业设计)

本文项目编号 T 059 &#xff0c;文末自助获取源码 \color{red}{T059&#xff0c;文末自助获取源码} T059&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【抖音矩阵源码开发:短视频矩阵SEO技术深度解析与实践指南】

开发部署短视频矩阵源码的主要步骤如下&#xff1a; 开发和部署短视频矩阵平台涉及一系列精细化的技术步骤&#xff0c;旨在确保系统的高效构建与稳定运行。该流程起始于开发环境的精心部署&#xff0c;涵盖PHP环境的搭建、集成开发环境&#xff08;IDE&#xff09;的配置以及…

STM32编码器接口笔记

1. 引言 在现代控制系统中&#xff0c;编码器扮演着非常重要的角色。它就像一个精密的测量工具&#xff0c;可以告诉我们机械部件的位置和运动状态。在STM32微控制器中&#xff0c;编码器接口可以轻松地与各种编码器连接&#xff0c;实现精确的控制。我将在这里探讨STM32编码器…

string类的使用(上)

目录 1.string类的概念 2.string的构造函数&#xff08;实现初始化&#xff09; 3.对string类容量获取和操作 4.string类对象的访问和遍历 4.1operator[] 4.2begin和end 4.3 rbegin 和 rend 4.4迭代器分类 4.5范围for&#xff08;自动实现遍历&#xff09; 5.string类…

打造高效舒适的气膜网球馆—轻空间

气膜网球馆&#xff0c;作为现代运动设施的创新选择&#xff0c;其成本构成涵盖多个重要方面&#xff0c;确保为运动者提供最佳体验。 一、膜材选择 膜材是气膜网球馆的核心&#xff0c;品质不同直接影响成本。高品质膜材不仅增强了耐用性&#xff0c;也能有效阻挡外界气候影响…

【展会回顾】阿尔泰科技2024上海工博会精彩瞬间,圆满收官 ,感恩遇见 ,共赴新程!

9月24日&#xff0c;以“工业聚能 新质领航”为主题的第二十四届中国国际工业博览会&#xff08;以下称“工博会”&#xff09;在国家会展中心&#xff08;上海&#xff09;举办&#xff0c;展示了一批代表中国工业领域的最新技术与前沿成果。 本届工博会的主题“工业聚能&…

Pycharm 本地搭建 stable-diffusion-webui

一、下载工程源码 Github官方连接 https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、Pycharm打开工程 1、设置环境 文件-设置-项目-Python解析器-添加解释器-添加本地解释器 Conda环境-创造新环境-Python版本3.10 注意一定要选择Python3.10版本&#xff0c;否…