在C语言中,结构体中只能定义变量,在C++中,结构体不仅可以定义变量,还可以定义函数。 例如:
struct Student { char _name[20]; char _sex[5]; int _age; int StudentInit(char *name, char *sex, int age) { strcpy(_name, name); strcpy(_sex, sex); _age = age; } };这样的结构体,在C++中常用class来代替。即类。
类的定义:
class classname { //主体 : 成员函数和成员变量 };例:
在定义类的时候,一般将成员函数的定义和类定义分开,跨文件定义。即类外定义成员函数,类里只进行声明。
例:上述例子的类外定义成员函数
类的访问限定符:
public(公有)private(私有)protected(保护)使用说明:
public修饰的成员在类外可直接被访问protected和private修饰的成员在类外不能直接被访问访问权限作用域是从该访问限定符出现的位置到下一个访问限定符出现为止class的默认访问权限为private,struct为public(因为要兼容C)封装: 将数据和操作数据的方法进行结合,隐藏对象的属性和实现方法的细节,仅对外公开接口来和对象进行交互。
类的实例化:用类类型创建对象的过程,称为类的实例化
定义出来的类,并没有分配实际的内存空间实例化出的对象,占用实际的物理空间,存储类成员变量类对象的存储方式:
每个对象都有各自有成员函数 缺点: 每一个对象中都会保存相同的代码,会造成空间浪费。‘
每个对象有着相同的成员函数 成员函数放在公共的代码段。 优点:节省空间。
实际上,编译器采用了第二种存储方式。但是,一个对象在实际情况中,只存储了成员变量。
例: 类中,考虑了内存对齐的问题。故上述输出为32。
而类的成员函数存储在了代码段。
则计算类的大小:只计算成员变量的大小。(考虑内存对齐) 特殊情况:空类 | 无成员变量(只有方法),占有一个字节。
在大多数主流编译器中,为什么要给空类1个字节,而不是0呢? 为了区分 类 定义出的不同对象。
例: