Skip to content
On this page

CPP_类


标签:CPP/面向对象  

  • 面向对象的三大特征:封装继承多态。(外加一个抽象)
  • 封装:将一类事物的属性和行为封装在一起,称为类,并向用户提供公共接口对类的实例进行操控

访问权限

  • 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;    // 常引用,也是调用常成员函数
}

Last updated: