C++中const与final关键字的区别解析
C++中const和final关键字的核心区别
嘿,这俩关键字确实容易搞混——毕竟都是用来做“限制”的,但限制的方向完全不在一个频道上。我给你拆解得明明白白:
1. 核心用途天差地别
const:定义「只读」实体,禁止修改
它的核心是给各种东西加上“不能改”的锁,适用场景特别广:
- 修饰普通变量/对象:变量值一旦初始化就不能被修改
const int MAX_LIMIT = 100; MAX_LIMIT = 200; // 直接报错!const变量不允许二次赋值 - 修饰类成员函数:保证这个函数不会修改类的成员变量(除非成员变量标记了
mutable)class Book { private: int pages; public: int getPages() const { // const成员函数 // pages = 200; 报错!不能在const函数里修改成员变量 return pages; } }; - 修饰指针/引用:分三种细分场景,分别限制指针本身、指向的内容,或者两者都锁死
int num = 5; const int* ptr = # // 指向的内容不能改,但ptr可以换指向 int* const ptr2 = # // ptr2不能换指向,但指向的内容可以改 const int* const ptr3 = # // 指向和内容都不能改 - 修饰函数参数:防止函数内部修改传入的参数值
void log(const std::string& msg) { // msg = "new message"; 报错!不能修改const引用的参数 std::cout << "[LOG] " << msg << std::endl; }
final:阻止「继承/重写」,终止扩展链
它的核心是断后路,只针对类和虚函数生效:
- 修饰类:这个类不能被任何其他类继承
class BaseFinal final { // ... 类内容 }; class SubClass : public BaseFinal { // 报错!final类不允许被继承 // ... }; - 修饰虚函数:这个虚函数不能在子类中被重写
class Animal { public: virtual void makeSound() final { std::cout << "Animal sound" << std::endl; } }; class Cat : public Animal { public: void makeSound() { // 报错!final虚函数不允许被重写 std::cout << "Meow" << std::endl; } };
2. 适用对象完全不同
const可以覆盖变量、成员函数、指针、引用、函数参数等几乎所有需要“只读”限制的场景final只能作用在类、虚函数这两个地方,专门用来终止继承或重写的链条
3. 编译检查逻辑不同
const检查的是是否有修改操作:只要代码试图修改被const修饰的实体,编译器直接报错final检查的是是否有继承/重写操作:只要子类敢碰被final标记的类或函数,编译器立刻拦下来
一句话总结:const管的是“能不能改”,final管的是“能不能继承/重写”,完全是两个维度的限制。
内容的提问来源于stack exchange,提问作者Soumak Poddar
相关产品推荐
相关产品推荐

