Appearance
类
访问权限
public:公有访问权限,可以在类外被访问protected:受保护权限,可以在子类被访问,不允许类外访问private:私有访问权限,只能在内内部被访问- 默认访问权限为
private
类的大小
- 遵守 结构体字节对齐原则
- 空类的大小为 1 字节,用于占位,当有成员变量的时候,会给划分给变量
- 成员函数不占用类的大小
- 如果成员中有虚函数,会增加一个指针的大小(64 位上是 8 字节)
和结构体的区别
- 结构体成员默认是公有,类是私有
- 结构体默认继承方式是
public,类是private
this 指针
- 给每个非静态成员函数的隐藏指针
- 指向对象本身
- 不能改变指针的指向(为
const指针,参考 C 语言指针与 Const)
特殊成员函数
- 系统默认提供的几个特殊成员函数:
- 构造函数:
类名 () {} - 析构函数:
~类名 () {} - 拷贝构造函数:
类名 (const 类名 &) - 拷贝赋值函数:
& operator=(const 类名 &) - 取地址重载,常取地址重载(无需手动定义)
- 移动拷贝,移动赋值(C++11新特性,补充拷贝构造和拷贝赋值)
- 可以通过
Test(const Test&) = delete删除默认的函数
常成员函数和对象
常成员函数:
- 有些值不需要修改,为了成员变量不被成员函数修改,可以将成员函数设置成常成员函数
- 格式:
返回值类型 函数名(形参列表) const {函数体} - 常成员函数与同名的非常成员函数构成重载关系,因为隐藏形参 this 指针的类型不同:
- 常成员函数:
const Stu * const this:不能修改指向,不能修改内容 - 非常成员函数:
Stu * const this:不能修改指向,能修改内容
- 常成员函数:
- 非常对象,优先调用非常成员函数,如果有该非常成员函数,则调用同名的常成员函数
- 常对象,只能调用常成员函数,不能调用非常成员函数,如果没有该常成员函数,报错
常对象:
- 定义对象时,在前面加上
const - 非常对象,优先调用非常成员函数,如果有该非常成员函数,则调用同名的常成员函数
- 常对象,只能调用常成员函数,不能调用非常成员函数,如果没有该常成员函数,报错
- 常引用的目标为非常对象
mutable 关键字
- 使用该关键字修饰的成员变量,可以在常成员函数中被修改,取消常属性
- 定义格式:
mutable 数据类型 属性名
cpp
class Stu {
private:
int score;
mutable int age;
public:
void show() const { // 常函数
this->score = name;
this->age = age;
}
void show() {} // 是重载
};
int main() {
const Stu s1; // 常对象
Stu s2;
const Stu &ref = s2; // 常引用,也是调用常成员函数
}