前言
- C有内置类型(int、char等)和自定义类型(结构体、枚举等)
经过入门的铺垫,就能学习C++的结构体class
- 这节的难点是类的实例化和this指针的用法
一、什么是class?
- C++中结构体的成员包括对象(变量) 和方法(函数)
- C++上更多用class代替struct
二、class的用法
1.定义
- C++注重封装性,一般将对象和方法放在同一个类中
- 不想被用户修订的数据用private或provated保护,可以被修改的用public
2.class的作用域
- 在类外定义成员,要用作用域(::)—》 类名::成员 ,说明是哪个类的
- 例如
3、class的实例化
类的定义就像一张蓝图;类的实例化过程就像工程师根据蓝图实现
注意:
- 类的定义是不占物理空间,类实例化后才占空间
- 一个类可以实例化多个对象
4、class的大小
- 类中的大小只包括对象(变量),不包含函数
原因:
变量可以定义成不同数据,而函数则是调用同一份空间,如果单独保存数据,就会导致相同的代码多次保持,因此将成员函数放在公共代码段,只保存成员变量的大小
- 类的大小计算满足内存对齐规则
内存对齐规则:
对齐数=成员对齐数大小 与 编译器默认对齐数 的 最小值 Vs编译器下默认对齐数是8
最大对齐数=成员类型的最大大小 和 默认对齐数 的最小值
1、第一个成员从0地址开始
2、其他成员对齐到对齐数的整数倍地址
3、结构体大小=最大对齐数的整数倍
- 练习
2和3是空类,占一个字节,不为存放变量,编译器来唯一标识这个类。
5、this指针
有一句经典的话,当你进入一间房间后,你会看到地板、桌子、椅子....但是看不到房子的全貌;
对于一个实例来说,你可以看到成员变量、成员函数,但看不到实例本身;
this指针就是时刻指向这个实例本身;
- 函数体所有成员访问都是通过this指针,this指针调用谁就传谁的指针
- this的类型是 *const
- 本质是形参,存在栈区
思考 下列程序运行的结果;
- Printf()会运行奔溃,
在cout<< _a<<endl; 中调用了成员对象,this指针要解引用,由于指针是nullptr,所以无法访问,程序奔溃;
- Show()正常运行,
成员函数放在公共代码段,不需要指针去找,所以空指针不影响;
三、总结
- 类和对象中较为简单的一节,学了类的定义,类的实例化,复习结构体大小的计算,了解了this指针调用谁就指向谁;
- 重点是结构体大小的计算,this特殊用法;
——-——编程没有捷径