【C++】类和对象·this指针

C++中的类与C语言中的结构体有很多的相似的地方,可以说本质上除了结构体只能定义成员变量,以及结构体默认的访问控制权限是public之外与class没啥区别。但是结构体变量每次调用函数的时候需要指针,而类中的成员函数明明被保存在公共代码段,他们调用的也是同一个函数,对象调用函数却不用传指针也能精准对对象的数据成员进行操作,其实是编译器默默承担了这一切。编译器自动地生成了一个this指针,作为成员函数的一个参数...


一、什么是this指针?

        this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。全局仅有一个this指针,当一个对象被创建时,this指针就存放指向对象数据的首地址


二、放入代码中理解

在正常创建类和实例化对象时我们是这样做的:

class date
{
public:date(int year, int month, int day){_year = year;_month = month;_day = day;}void print_d(){cout << _year << "年" << _month << "月" << _day << "日" << endl;;}
private:int _year;int _month;int _day;};int main()
{date d1(2024, 7, 17);date d2(2024, 7, 18);d1.print_d();d2.print_d();return 0;
}

实际上编译器对成员函数和对象调用函数做了以下的改变(粗体的部分):

this指针的相关形参和实参是不能显示着写的(背景为绿色的部分),但是在类里面可以显示着使用(背景为蓝色的部分)

    date(date* const this, int year, int month, int day)
    {
        this->_year = year;
        this->_month = month;
        this->_day = day;
    }
    void print_d(date* const this)
    {
        cout << this->_year << "年" << this->_month << "月" << this->_day << "日" << endl;
    }

    date d1(&d1, 2024, 7, 17);
    date d2(&d2, 2024, 7, 18);

    d1.print_d(&d1);
    d2.print_d(&d2);

以上表达式中 this->_year= year; 和 (*this)._year = year; 以及 _year = year; 是一样的,初期的时候可以在类里将this直接写出来方便自己理解,后期可以直接省略。(此时也能表明类的成员变量要有特定表示比较好,_year和year更直观便捷) 。


三、this指针小知识

  1.this指针存放在哪里?

        指针是形参,存在栈帧上,vs下存到ecx寄存器中。

  2.this指针的类型

        CLASS* const this    (const在*后修饰的是指针,在*前修饰的是指针指向的对象) 这意味着this指针是不能修改的,它不能显示着写,所以也不存在修改一说。

  3.关于this指针的小题目

(下列程序会有怎样的运行结果?)

class A
{
public:void Print(){cout << "Print()" << endl;}
private:int _a;
};int main()
{A* p = nullptr;p->Print();return 0;
}

 👆这个程序其实是会正常运行的,虽然this指针为空,但是Print()函数并没有使用到this指针,所以也没有出问题。

class A
{
public:void PrintA(){cout << _a << endl;}
private:int _a;
};int main()
{A* p = nullptr;p->PrintA();return 0;
}

 👆而这个程序就会运行崩溃(还是能通过编译的如果出现了p->_a = 1;这种直接空指针访问了对象成员变量会不能编译通过报错),因为this指针被使用了,但它是一个空指针。(当然,每个编译器不一样,在这个问题上也可能会有不同的结果出现随机值,正常运行(编译器优化)都是有可能的)


-The End-

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

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

相关文章

Redis之哈希类型

目录 一.命令 二.内部编码 1.压缩列表&#xff08;ziplist&#xff09; 2. 哈希表&#xff08;Hashtable&#xff09; 自动转换策略 三.作为缓存 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.命令 HSET命令 设置hash中指定的字段&#xff08;field)的值,时…

Ubuntu22.04安装OMNeT++

一、官网地址及安装指南 官网地址&#xff1a;OMNeT Discrete Event Simulator 官网安装指南&#xff08;V6.0.3&#xff09;&#xff1a;https://doc.omnetpp.org/omnetpp/InstallGuide.pdf 官网下载地址&#xff1a;OMNeT Downloads 旧版本下载地址&#xff1a;OMNeT Old…

OAI 5G-NR源码架构

OAI 5G-NR源码架构 1 特性范围 目前gNB和5G-NRUE支持如下的配置&#xff1a; 工作模式&#xff1a;TDDCP长度&#xff1a;Normal CP子载波间隔&#xff1a; 30kHz信道带宽&#xff1a;40MHz(106PRB)、80MHz(217PRB)、100MHz(237PRB)天线端口&#xff1a;单波束时隙格式&…

Redis-应用

目录 应用 缓存雪崩、击穿、穿透和解决办法? 布隆过滤器是怎么工作的? 缓存的数据一致性怎么保证 Redis和Mysql消息一致性 业务一致性要求高怎么办? 数据库与缓存的一致性问题 数据库和缓存的一致性如何保证 如何保证本地缓存和分布式缓存的一致&#xff1f; 如果在…

solidity基础语法(以太坊solidity合约)

solidity基础语法&#xff08;以太坊solidity合约&#xff09; 1-值类型和取值范围2-引用类型3-引用类型高阶4-固定数组和动态数组 1-值类型和取值范围 https://learnblockchain.cn/docs/solidity/introduction-to-smart-contracts.html#subcurrency https://learnblockchain…

WEB前端06-DOM对象

BOM浏览器对象模型 浏览器对象模型&#xff1a;将浏览器的各个组成部分封装成对象。是用于描述浏览器中对象与对象之间层次关系的模型&#xff0c;提供了独立于页面内容、并能够与浏览器窗口进行交互的对象结构。 组成部分 Window&#xff1a;浏览器窗口对象 Navigator&…

Hadoop3:HDFS存储优化之小文件归档

一、情景说明 我们知道&#xff0c;NameNode存储一个文件元数据&#xff0c;默认是150byte大小的内存空间。 那么&#xff0c;如果出现很多的小文件&#xff0c;就会导致NameNode的内存占用。 但注意&#xff0c;存储小文件所需要的磁盘容量和数据块的大小无关。 例如&#x…

电脑压缩视频文件 电脑压缩视频大小的方法

在数字化时代&#xff0c;视频已成为我们记录生活、分享快乐的重要工具。然而&#xff0c;大尺寸的视频文件常常让分享和存储变得棘手。如何在保持视频画质的前提下&#xff0c;轻松减小视频文件大小&#xff1f;今天&#xff0c;就让我们一起探索苹果电脑上的几种高效视频压缩…

iPhone手机怎么识别藏文?藏语翻译通App功能介绍:藏文OCR识别提取文字

在工作学习的过程中&#xff0c;遇到不会的藏文&#xff0c;也不知道怎么把文字打出来&#xff0c;这个时候可以试试《藏语翻译通》App的图片识别功能&#xff0c;支持拍照识别和图片识别&#xff0c;拍一拍就能提取藏文文字&#xff0c;并支持一键翻译和复制分享。 跟着小编的…

数据结构之双向链表(赋源码)

数据结构之双向链表(源码) 线性表 双向链表是线性表链式存储结构的一种&#xff0c;若对链式存储结构进行分类可以分为八种。 带头、不带头&#xff1a;指的是该连链表有无头节点&#xff0c;头节点不存放任何内容&#xff0c;它不一定是链表必备的元素&#xff0c;而一个链…

十五、【机器学习】【监督学习】- 神经网络回归

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

RPA鼠标按键使用技巧

RPA鼠标按键使用技巧 Mouse.MouseAuto.Action命令出错&#xff0c;调用的目标发生了异常&#xff0c;Exception in Mouse.Action元素不可用怎么解决 出现问题 1.想要实现的效果鼠标移动到录屏工具的小球上2.点击开始按钮开始录屏现象&#xff0c;鼠标没有移动痕迹&#xff0c…

C1W4.Assignment.Naive Machine Translation and LSH

理论课&#xff1a;C1W4.Machine Translation and Document Search 文章目录 1. The word embeddings data for English and French words1.1The dataThe subset of dataLoad two dictionaries 1.2 Generate embedding and transform matricesExercise 1: Translating English…

华为的热机备份和流量限制

要求&#xff1a; 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW4&#xff0c;生产区和办公区的流量走FW5 13&#xff0c;办公区上网用户限制流量不超过100M&#xff0c;…

智慧博物馆的“眼睛”:视频智能监控技术守护文物安全与智能化管理

近日&#xff0c;位于四川德阳的三星堆博物馆迎来了参观热潮。据新闻报道&#xff0c;三星堆博物馆的日均参观量达1.5万人次。随着暑假旅游高峰期的到来&#xff0c;博物馆作为重要的文化场所&#xff0c;也迎来了大量游客。博物馆作为文化和历史的重要载体&#xff0c;其安全保…

QT应用编程: window下QT程序异常捕获并生成DMP文件、PDB文件

文章目录 main.cpp代码捕获异常 生成dmp文件和pdb文件DebugTest生成错误代码注意 分析软件崩溃&#xff0c;除了需要dmp&#xff0c;还需要这个pdb文件 dmp&#xff0c;文件记录了崩溃的信息&#xff0c;而pdb&#xff08;代码工程数据库&#xff09;&#xff0c;则包含了你写的…

全局 loading

好久不见&#xff01; 做项目中一直想用一个统一的 loading 状态控制全部的接口加载&#xff0c;但是一直不知道怎么处理&#xff0c;最近脑子突然灵光了一下想到了一个办法。 首先设置一个全局的 loading 状态&#xff0c;优先想到的就是 Pinia 然后因为页面会有很多接口会…

AI软件小说推文直接生成漫画短视频,小说推广项目的辅助工具,前端uniapp。

有哪些AI的软件是比较热门的&#xff1f; 以下是一些常用的网页AI软件&#xff0c;可以用于绘图&#xff1a; Canva&#xff1a;Canva是一个非常受欢迎的网页平台&#xff0c;提供各种图形设计和绘图工具。它具有易于使用的界面和大量的模板和元素&#xff0c;可以帮助你创建出…

Qt 使用Installer Framework制作安装包

Qt 使用Installer Framework制作安装包 引言一、下载安装 Qt Installer Framework二、简单使用2.1 创建目录结构 (文件夹结构)2.2 制作程序压缩包2.3 制作程序安装包 引言 Qt Installer Framework (安装程序框架)是一个强大的工具集&#xff0c;用于创建自定义的在线和离线安装…

【网络安全】PostMessage:分析JS实现XSS

未经许可&#xff0c;不得转载。 文章目录 前言示例正文 前言 PostMessage是一个用于在网页间安全地发送消息的浏览器 API。它允许不同的窗口&#xff08;例如&#xff0c;来自同一域名下的不同页面或者不同域名下的跨域页面&#xff09;进行通信&#xff0c;而无需通过服务器…