IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++ 类的三步编译【由基础到进阶】 -> 正文阅读

[C++知识库]c++ 类的三步编译【由基础到进阶】

c++类的三步编译

类是一种数据类型,定义时,系统不为其分配空间,所以不能对类的数据成员初始化,类中任何数据成员也不能使用关键字extern,auto,或register限定其存储类型。

编译器对对程序员自己设计出来的类分为三次编译

第一:

识别和记录类体中属性的名称,类型,和访问限定,与属性在类体中的位置无关 (通俗点,就是看看都有哪些变量,这些变量起的啥名字,类型是啥,还有是处在 pulic块中,还是 private 块,还是处在protected块中)

第二:

识别和记录类体中函数的原型(返回类型 + 函数名+参数列表) 形参的默认
值,访问限定符(通俗点,就是看看都有哪些方法,这些方法起的啥名字,形参是咋样的,返回类似是咋样的)

让我们先来证明一下第二步

对于这样的函数,编译器编译是通过不了的,因为funa在执行到,funb()这句代码时,它就会懵逼了,它不清除这个是什么。
在这里插入图片描述
在这里插入图片描述
但是当把它放到类中时,就不会出现编译错误,因为在编译的第二步 就进行了函数原型的识别
当它执行到这一步,它知道funb函数的名字,形参,返回值,这是编译第二不实现的,这也可以理解为funb已经声名了
在这里插入图片描述

第三:

改写在类中定义函数的参数列表和函数体,改写成对象调用成员函数的形式
(形参列表加this指针,函数体内如果出现成员属性或者成员方法的调用,则在前面加this指针)

class student {
 private:
	 int age;
	 string name;
public:
	void RegisterStudent(int Aage, string Aname);
	
};
void student::RegisterStudent(int Aage, string Aname) {
	age = Aage;
	name = Aname;
}
int main() {
	student s1, s2;
	s1.RegisterStudent(12,"李华");
	s2.RegisterStudent(11,"小明");

}

上面的RegisterStudent被改写之后就变成了这样

void RegisterStudent(student * const this,int Aage, string Aname){
  this->age =Aage;
  this->name=Aname;
}

而当函数在执行到这一步时,
s1.RegisterStudent(12,“李华”); 时,
实际底层是这样的
RegisterStudent(&s1,12,“李华”)
而this也就指向了s1的地址
在这里插入图片描述
类的设计图
在这里插入图片描述

而在一个类中,把所有的方法都放在一个区域,通过this指针的方法,节省了内存的空间,但是事情往往是相互的。
于此同时编译器设计的复杂度要变大(为函数形参和函数体添加this指针),编译器编译的时间也要变长。

那为什么this指针为常性呐?

让我们看下面代码
在这里插入图片描述
因为如果不是常性的话,那这样程序员就可以修改this的指向,使其指向nullptr,甚至指向其他对象的地址,这样是及其危险的,这样的话,明明是A对象调用它的成员函数,但是却让B对象执行行为。
这样的话使其这个函数不能完成该功能。

让我们进行总结,
第一步:就是看成员属性都有啥,都是啥,
第二步: 就是看成员方法都有啥,都是啥
第三步:添加this指针

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:26:01  更:2022-05-18 17:28:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:47:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码