当前位置: 首页 > news >正文

C++--类中this指针的讲解

一,引言

在C++类中,类的内存存储中为了减少内存的使用,类中的成员函数并不存储在类对象中,当不同的类对象调用相同的成员函数时,成员函数是如何进行区分究竟是哪一个类对象进行调用的呢,C++为了解决这个问题就引入了this指针的概念。

二,底层讲解

每一个成员函数,由编译器自动生成第一个参数,传入类对象的地址,专门负责确定由那个类对象进行调用的成员函数。举个例子:
 

class date
{
public:void Init(int year, int month, int day){// _year = year;_month = month;_day = day;}
private:int _day;int _month;int _year;
};
int main()
{date s1;date s2;s1.Init(1900, 2, 2);s2.Init(1900, 2, 3);return 0;
}

 s1和s2分别进行调用init函数,类中的成员函数是如何知道s1和s2呢。来看一下Init的函数原型:
 

void Init(Date* const this, int year, int month, int day)

编译器在进行编译的过程中,将s1或者s2的地址传给了this,进而函数找到了对应的类对象。

需要注意的是,this是编译器自动生成的,不能在形参或者实参写出来,但是在使用的时候可以使用。例如:

class date
{
public:void Init(int year, int month, int day)//这里面不可以写{// _year = year;this->_month = month;this->_day = day;}
private:int _day;int _month;int _year;
};
int main()
{date s1;date s2;s1.Init(1900, 2, 2);s2.Init(1900, 2, 3);return 0;
}

三,练习

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

 

针对上述代码的运行结果是什么呢?

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

 这次运行的结果又是什么呢?

第一个程序,当调用成员函数时,需要传入类对象的地址也就是指针,不管这个指针是什么无所谓,只要找到就行了,所以第一个是正常运行。

第二个程序,前面都是一样的,当调用到成员变量是需要对这个指针进行解引用,nullptr不能解引用进而会报错。

http://www.xdnf.cn/news/352855.html

相关文章:

  • 从数据孤岛到智能工厂:RG3000边缘网关的数字化转型实践
  • Mac QT水平布局和垂直布局
  • 小红书视频无水印下载方法
  • AI技术与园区运营的深度融合:未来生态型园区的建设路径
  • VS Code配置指南:打造高效的QMK开发环境
  • 老旧 LabVIEW 系统升级改造
  • 系统的从零开始学习电子的相关知识,该如何规划?你是工作了18年的电子工程师,请给出你的建议
  • 三维GIS开发cesium智慧地铁教程(6)添加模型
  • 31【干货】Arcgis属性表常用查询表达式实战大全
  • 基于Java和GeoTools的根据矢量BBOx自动生成格网文件实践
  • 基于C++的多线程网络爬虫设计与实现(CURL + 线程池)
  • Java游戏服务器开发流水账(3)游戏数据的缓存简介
  • 第04章—技术突击篇:如何根据求职意向进行快速提升与复盘
  • 数据库索引
  • 使用Java处理多客户端服务器:从传统线程到虚拟线程
  • [250509] x-cmd 发布 v0.5.11 beta:x ping 优化、AI 模型新增支持和语言变量调整
  • kotlin 数据类
  • Electron知识框架
  • 基于SSM + JSP 的个人通讯录管理系统
  • 使用 ANSYS AEDT(单向耦合)进行高功率同轴射频滤波器的热分析
  • 前端取经路——性能优化:唐僧的九道心经
  • 橡胶制品行业质检管理的痛点 质检LIMS如何重构橡胶制品质检价值链
  • STM32外设-串口UART
  • 项目高压生存指南:科学重构身体与认知系统的抗压算法
  • 计算机二级WPS Office第三套电子表格
  • 排序算法-插入排序
  • Linux快速入门
  • 排序算法-归并排序
  • 在线caj转换word
  • 安全核查基线-2.nfslock服务