一、类的定义1.1 类定义格式class为定义类的关键字Stack为类的名字{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。为了区分成员变量⼀般习惯上成员变量会加⼀个特殊标识如成员变量前⾯或者后⾯加_或者m开头注意C中这个并不是强制的只是⼀些惯例具体看公司的要求。C中struct也可以定义类C兼容C中struct的用法同时struct升级成了类明显的变化是struct中可以定义函数一般情况下推荐使用class定义类定义在类面的成员函数默认为inline。1.2 访问限定符1.3 类域类定义了⼀个新的作用域类的所有成员都在类的作用域中在类体外定义成员时需要使用::作用域操作符指明成员属于哪个类域。类域影响的是编译的查找规则下面程序中Init如果不指定类域Stack那么编译器就把Init当成全局函数那么编译时找不到array等成员的声明/定义在哪⾥就会报错。指定类域Stack就是知道Init是成员函数当前域找不到的array等成员就会到类域中去查找。下面是加了类域的1.4 C和C语言实现Stack对比1.5类的默认成员函数二、实例化2.1 实例化概念用类类型在物理内存中创建对象的过程称为类实例化出对象。类是对象进行⼀种抽象描述是⼀个模型⼀样的东西限定了类有哪些成员变量这些成员变量只是声明没有分配空间用类实例化出对象时才会分配空间。⼀个类可以实例化出多个对象实例化出的对象占用实际的物理空间存储类成员变量。打个比方类实例化出对象就像现实中使用建筑设计图建造出房子类就像是设计图设计图规划了有多少个房间房间大小功能等但是并没有实体的建筑存在也不能住人用设计图修建出房子房子才能住人。同样类就像设计图⼀样不能存储数据实例化出的对象分配物理内存存储数据。2.2 对象大小#includeiostream using namespace std; // 计算⼀下A/B/C实例化的对象是多⼤ class A { public: void Print() { cout _ch endl; } private: char _ch; int _i; }; class B { public: void Print() { //... } }; class C {}; int main() { A a; B b; C c; cout sizeof(a) endl; cout sizeof(b) endl; cout sizeof(c) endl; return 0; }A类8字节B类1字节C类1字节注意成员函数 Print() 不占对象空间函数代码存放在代码段不属于对象。上⾯的程序运⾏后我们看到没有成员变量的B和C类对象的⼤⼩是1为什么没有成员变量还要给1个 字节呢因为如果⼀个字节都不给怎么表⽰对象存在过呢所以这⾥给1字节纯粹是为了占位标识 对象存在。其中B类为空类只有成员函数没有成员变量。C 标准规定每个对象必须有一个独一无二的地址即 b1 ! b2。如果空类大小为 0两个对象就无法区分。因此空类大小被规定为 1 字节编译器插入一个占位字节。其中C类为纯空类。完全为空同样遵循空类最小 1 字节规则结果为 1。三、this指针