C++ 中的 Const 与 Final

问题描述

我在 C++ 中学习 OOPS,遇到了关键字 constfinal。现在我怀疑它们之间有什么区别。

解决方法

考虑到其他答案,我想这个问题需要一个答案。

在 C++ 中不能将 final 应用于变量,所以“哪个更好”的问题只能用“const”来回答,因为只有这个才能编译。


final 说明符被引入到 C++11 并且可以应用:

  1. 对于类,在这种情况下类不能用作基类
class A final {};
class B: public A {}; //error
  1. virtual 函数,以防止派生类覆盖它
class A {
    virtual void foo() = 0;
};
class B: public A {
    void foo() final {}
};
class C: public B {
    void foo() {} //error
};

const 关键字从一开始就在 C++ 中,用于

  1. 将变量标记为不可修改。非成员变量必须在它们声明的地方初始化,成员必须在构造函数初始化列表中初始化。它不像 Java 中的 final,你不能给它赋值一次。
const std::vector<int> v;
v = std::vector<int>{}; //error
v.push_back(1); //error
  1. 将类成员函数标记为可用于 const 对象。这也可以防止您修改该函数内的类成员
class A {
    int n;
public:
    int getN() const {return n;}
    void setN(int n) {this->n = n;} //cannot be const,modifies a member
};

const A a;
a.getN(); //fine
a.setN(5); //error
,

不,这不是 final 的用途。您可能会将其与其他语言的用法混淆。

如您所见,here,在声明变量时根本不使用 final

const int val = foo();

这就是您定义不会更改的变量的方式,这就是您在问题中提到的情况。 final 与此无关。这可能类似于 final 在某些其他语言中的含义,因为 foo() 在编译时是未知的,并且变量需要被初始化,然后不能更改。这就是 const 在 C++ 中的含义。

在 C++ 中,final 用于声明类不会派生自,或者虚函数不会被进一步覆盖。