【C++复习第5小节】类和对象

文章目录

      • [1. 内存对齐](#1. 内存对齐)
      • [2. this 指针](#2. this 指针)
      • [3. 构造函数](#3. 构造函数)
      • [4. 析构函数](#4. 析构函数)

1. 内存对齐

cpp 复制代码
#pragma pack(1)   //指定对齐数为 1
  • 💧有一个小问题问大家,内存对齐其实也会造成空间浪费,为什么还要内存对齐呢?
    》因为计算机读取数据是有要求的,要么就读取4个字节,要么就是读取8个字节,没有内存对齐会多读取几次,造成效率低下。

2. this 指针

  • 🍎this指针的特点:

    this指针只能在成员函数内部使用;

    this指针的类型:类的类型 * const,即成员函数中,不能给this指针赋值,this指针本身自己是不能改变的;

    this指针本质上是"成员函数"的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针;

    this指针是"成员函数"第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递;


  • 🍎为什么要有this指针呢?
    因为需要满足调用同一个成员函数,然后访问的是不同的成员变量;
cpp 复制代码
// 实际上的this指针是这样的,但是记住:不可以显示的写,但是成员函数里面可以使用this指针
void Print(Date* const this) {
	cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
}



  • 🍎this指针存在哪里的呢
    this指针是存储在栈区的,因为它是一个形参。

  • 🍎两道极易弄错的题目
    编译器很聪明,会判断解引用后有没有意义,如果解引用后没有意义,就算你是*p,我也不会进行解引用。
cpp 复制代码
// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
	void Print()
	{
		cout << "Print()" << endl;
	}
private:
	int _a;
};
int main()
{
	A* p = nullptr;

	// 要明白一点:成员函数不是存储在对象中的,是存在公共的代码段中的
	// 编译器很聪明,不会做多余的操作,所以不会对 p 解引用
	p->Print();
	return 0;
}
cpp 复制代码
// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
	// 这里实际上是: void PrintA(A* const this) 
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	int _a;
};

int main()
{
	A* p = nullptr;
	// 这边传过去实际上是:  PrintA(p)
	p->PrintA();
	return 0;
}

  • 🍉tips:静态成员函数是没有this指针的,原因是:因为静态成员函数不依赖具体对象,所以在调用时,函数没有与特定的对象绑定。this 指针是指向调用成员函数的那个对象的地址。静态成员函数不与任何对象绑定,自然没有特定的对象可供指向。

3. 构造函数

🐧构造函数----初始化对象

🐧如果我们不写构造函数的话,编译器会自动生成一个默认的构造函数,但是编译器生成的默认构造函数,对于内置类型不做处理,对自定义类型调用它的默认构造函数。(可以理解对"内置类型不做"打了一个补丁,可以允许对成员变量声明的位置给缺省值)

  • 🍉构造函数的特征
    ①构造函数名跟类名一样,无返回值;
    ②构造函数可以重载,有无参构造函数和带参构造函数;
    ③对象实例化时,编译器自动调用对应的构造函数;

  • 🍉默认成员函数和默认构造函数这两个概念大家区分的清楚吗?
    默认成员函数 :用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

    默认构造函数 :无参构造函数、全缺省构造函数、我们不写编译器默认生成的构造函数(注意:这三者是不可能同时存在的,一般我们推荐写全缺省构造函数),都可以认为是默认构造函数。 不需要传参就可以调用构造函数,都可以叫做默认构造函数。

4. 析构函数

🐧析构函数-----自动清理
注意 ❗:构造函数的顺序是先定义的先构造;而析构函数的顺序是先定义的后析构;

相关推荐
城管不管2 分钟前
rabbitmq如何保证消息不丢失?解决方案又是什么?
开发语言·ai·面试·职场和发展·rabbitmq·php·agent
程序员良辰3 分钟前
【TongWeb7】启动接近两分钟问题排查
java·开发语言·中间件
深色風信子5 分钟前
Kotlin Bytedeco OpenCV 图像图像58 无缝克隆
开发语言·opencv·kotlin·bytedeco
朝阳3916 分钟前
react19【系列实用教程】实用组件封装
开发语言·前端·javascript
我是苏苏24 分钟前
C#基础:使用System.Speech.Synthesis离线播放/朗读文字内容
开发语言·c#
j7~34 分钟前
【Linux】二十八.线程篇五《Linux多线程编程:线程同步之条件变量》---详解
linux·运维·c++·学习·条件变量·线程同步
王老师青少年编程35 分钟前
2026年全国青少年信息素养大赛算法应用主题赛C++赛项【决赛】模拟卷3:文末附答案
c++·答案·模拟题·2026年·青少年信息素养大赛·算法应用主题赛·决赛
Patrick在香港37 分钟前
Python依赖管理从踩坑到选型:pip/poetry/uv四种方案全面实测
开发语言·python·数据分析·scikit-learn·ai编程·pip·uv
我命由我1234539 分钟前
Kotlin 面向对象 - 枚举排序
android·java·开发语言·java-ee·kotlin·android studio·android-studio
程序喵大人42 分钟前
【C++进阶】STL容器与迭代器 - 10 把容器、迭代器和数据流串成一个小程序
开发语言·c++·容器·小程序·迭代器·stl