一、const 关键字(成员函数版)

1. 语法

返回值 函数名(参数) const { ... }

2. 核心作用

const 修饰成员函数:承诺本函数不会修改类的普通成员变量。

3. 硬性规则

  1. const 成员函数不能修改普通成员变量
  2. const 成员函数不能调用非 const 成员函数
  3. const 对象 只能调用 const 成员函数
  4. 普通对象可以调用 const 成员函数
  5. void f();void f() const; 构成函数重载

4. 示例

class Test
{
    int x;
public:
    void set(int v) { x = v; }          // 可修改
    int get() const { return x; }        // 只读,不能改x
};

5. 常成员变量

const int a = 10;

必须初始化,之后不能修改。


二、override 关键字

1. 语法

只能用在派生类的虚函数末尾

virtual void fun() override;

2. 核心作用

显式告诉编译器:这个函数是用来重写父类的虚函数,请严格检查格式是否一致。

3. 检查哪些东西

编译器强制校验:

  • 函数名必须一样
  • 参数列表必须一样
  • 返回值兼容
  • const 修饰必须一致
  • 虚函数属性匹配

4. 为什么要用?

不加 override:

  • 你写错参数 / 漏写 const → 编译器不报错
  • 不会重写,变成隐藏,多态直接失效,运行时 bug

加 override:

  • 只要和父类虚函数对不上,直接编译报错,提前排错

示例

class Base
{
public:
    virtual void show() const {}
};

class Deri : public Base
{
public:
    // 正确:完全匹配
    void show() const override {}

    // 错误:少了const,override直接报错
    // void show() override;
};

三、final 关键字(两种用法)

用法 1:修饰虚成员函数

作用

禁止子类继续重写这个虚函数

class Base
{
public:
    virtual void f() final {}
};

class Son : public Base
{
public:
    // 编译报错:f是final,不能重写
    // void f() override;
};

用法 2:修饰

作用

禁止这个类被继承

class A final { };

// 编译报错:不能继承final类
// class B : public A { };

总结口诀

  • final 函数:不许再重写
  • final 类:不许再继承

四、noexcept 关键字

1. 语法

void fun() noexcept;

2. 核心作用

给编译器承诺:这个函数绝对不会抛出异常。

3. 好处

  1. 编译器可以做更好优化
  2. STL 容器(vector)会优先选择 noexcept 的移动构造 / 移动赋值,提升性能
  3. 代码语义清晰,一眼看出不会抛异常

4. 违规后果

如果标了 noexcept,内部却强行 throw:程序直接调用 std::terminate 强制终止

5. 常用场景

  • 移动构造函数
  • 移动赋值运算符
  • 简单只读工具函数
  • const 成员函数常搭配 noexcept

示例

int getVal() const noexcept
{
    return x;
}

五、delete 关键字 = 禁用函数

1. 语法

函数声明 = delete;

2. 核心作用

把某个函数直接 “删掉”,禁止任何人调用,调用就编译报错。

3 大常用场景

场景 1:禁用编译器默认生成的函数

默认函数包括:

  • 默认构造
  • 拷贝构造
  • 赋值重载
  • 析构函数
class Person
{
public:
    // 禁用默认构造
    Person() = delete;
    // 禁用拷贝构造
    Person(const Person&) = delete;
    // 禁用赋值
    Person& operator=(const Person&) = delete;
};

场景 2:禁用函数重载版本

void func(int);
// 禁止传double
void func(double) = delete;

场景 3:禁止隐式类型转换

struct A
{
    // 禁止用int构造,禁止隐式转换
    A(int) = delete;
};

4. 特点

  • 编译期禁止,运行时无隐患
  • 比 private 禁用更干净、更规范

六、五个关键字组合标准写法(工程 / 考试标配)

class Base
{
public:
    // 虚函数 + const + noexcept
    virtual void show() const noexcept = 0;
};

class Son : public Base
{
public:
    // 重写 + 校验override + 只读const + 不抛异常noexcept + 禁止后代再重写final
    void show() const noexcept override final;
};

七、终极一句话背诵(期末必考)

  1. const:成员函数只读,不修改成员变量,const 对象只能调用 const 函数。
  2. override:派生类显式重写虚函数,编译器强制签名校验,防止多态出错。
  3. final:修饰虚函数禁止重写,修饰类禁止继承。
  4. noexcept:承诺函数不抛异常,利于编译优化和 STL 性能提升。
  5. delete:禁用指定函数,禁止调用、禁止默认函数、禁止隐式转换。

更多推荐