C++ const /noexcept/override/final/delete一口吃透
·
一、const 关键字(成员函数版)
1. 语法
返回值 函数名(参数) const { ... }
2. 核心作用
const 修饰成员函数:承诺本函数不会修改类的普通成员变量。
3. 硬性规则
- const 成员函数不能修改普通成员变量
- const 成员函数不能调用非 const 成员函数
- const 对象 只能调用 const 成员函数
- 普通对象可以调用 const 成员函数
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. 好处
- 编译器可以做更好优化
- STL 容器(vector)会优先选择 noexcept 的移动构造 / 移动赋值,提升性能
- 代码语义清晰,一眼看出不会抛异常
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;
};
七、终极一句话背诵(期末必考)
- const:成员函数只读,不修改成员变量,const 对象只能调用 const 函数。
- override:派生类显式重写虚函数,编译器强制签名校验,防止多态出错。
- final:修饰虚函数禁止重写,修饰类禁止继承。
- noexcept:承诺函数不抛异常,利于编译优化和 STL 性能提升。
- delete:禁用指定函数,禁止调用、禁止默认函数、禁止隐式转换。
更多推荐

所有评论(0)