You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:53:11