3 C++类与对象核心概念:类的定义、实例化与this指针
2026/8/30 16:12:14 网站建设 项目流程

1 类的定义

① 类是C++中一种用户自定义类型,它把数据成员和操作这些数据的成员函数封装在一起,是创建对象的模板。类就是对“数据+操作数据的方法”的封装,是创建对象的模板。

② 类中的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数

类负责把“数据”和“操作数据党的方法”封装到一起;访问限定符负责控制“谁能访问这些成员”。

1.1 类定义格式

1.2 访问限定符

C++中有三种访问限定符:publicprivateprotected
public成员可以被类内部、派生类以及类外部访问,通常用来定义类对外提供的接口。
private成员只能由类自身的成员函数访问,外部和普通派生类不能直接访问,通常用于隐藏类内部实现和保护成员数据。
protectedprivate类似,类外部不能直接访问,但派生类可以访问,因此主要用于继承。

在实际设计种通常把成员变量设为private,通过public成员函数对外提供操作接口,实现封装并防止外部随意破坏对象内部状态。

class定义成员没有被访问限定符修饰时默认privatestruct默认public
一个访问限定符会一直作用到下一个访问限定符出现为止。

C 中的struct通常用于组织数据,并经常通过typedef简化类型名;而 C++ 对struct进行了扩展,结构体名本身就是类型名,同时struct可以包含成员变量、成员函数以及public/private/protected等访问限定符,因此它和class已经非常接近,最主要区别是struct默认public,而class默认private

2 实例化

2.1 实例化概念

类是类型,对象是类的一个具体实例,是实际存在并占用内存空间的实体。

类实例化对象,就是根据类这个自定义类型创建一个具体对象的过程。类本身只是对成员变量和成员函数的定义,相当于一种类型描述;实例化之后得到的对象才是真正在程序运行中存在的实体,并会占用内存空间。


2.2 对象大小

成员函数代码通常放在程序的代码区,由所有对象共享。
对象的大小主要由非静态成员变量决定,而普通成员函数不会增加每个对象的大小。

空类也要占1字节,主要是为了保证每个对象在内存中都有唯一、可区分的地址。如果空类对象大小为0,那么创建多个空类对象时,它们可能占用同一个内存位置,就无法保证不同对象拥有不同地址。因此,C++编译器通常会给空类对象分配至少1字节的空间,这个字节不是用来存成员数据的,而是用来标识这个对象在类中确实存在

② 对象大小不包含普通成员函数。成员函数的机器指令只需要保存一份,通常放在程序的代码段中,由同一个类的所有对象共享执行,而对象本身只需要保存各自独立的状态数据,也就是非静态成员变量。对象存在的是“数据”,成员函数存放的是“代码”;代码共享,数据独立,所以普通成员函数不计入对象大小。

3 this指针

this是C++普通非静态成员函数中一个隐含的指针,它保存当前调用该成员函数的对象地址。
编译器调用普通成员函数时,会隐式地把当前对象的地址传过去。


this本身是一个常量指针,不能让它重新指向其他对象,但可以通过它修改当前对象的数据。谁调用成员函数,this就指向谁,成员函数通过this找到当前对象的数据。

this不是对象的成员变量,不占对象空间,并且静态成员函数中不存在this指针。

this指针本质上是成员函数的一个隐含参数,所以它并不是固定存放在某“内存区域”中的成员变量。在现代C++的实际调用约定下,this往往优先通过CPU寄存器传递,如果寄存器不够或编译器需要保存它,也可能临时放到当前函数的栈帧中。之所以这样,是因为this只在成员函数调用期间有意义,用来告诉函数“当前操作的是哪个对象”,它不属于对象本身,因此不会存在对象所在的堆区或栈区中,也不会加入sizeof(对象)

this不是像对象/变量那样“分配在某个内存区域”的实体,而是成员函数被调用时由编译器隐式传入的当前对象指针值(通常走寄存器/栈传参实现,调用期存在),它指向当前对象本身所在的位置。

① 通过对象指针调用成员函数时,指针会作为当前对象的地址传给隐藏的this指针。
如果对象指针是nullptr,就不存在一个有效的当前对象。此时通过它调用非静态成员函数属于未定义行为;一旦访问this->_a这样的成员,通常就会因为非法访问内存而崩溃。
通过空指针调用非静态成员函数本身就属于未定义行为,不能认为“只要函数里不访问成员变量就一定安全”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询