如何在 C++ 中定义最终变量(可变常量)?

How to define a final variable (mutable constant) in C++?

如何在 C++ 中定义指向可变对象的常量?

如果我声明

static const CMyClass* IMPL;

并赋值

const CMyClass* CSomeClass::IMPL = new CMyClass;

那么我只能在对象上调用 const 函数。它的内部是锁着的。这不是我想要的。

如果我离开 const 限定符,我可以重新分配指针 IMPL,因此它不再作为常量受到保护,它应该是。 final 似乎只适用于 C++ 中的函数。在 C++ 中是否有等同于 Java 的 final 变量?

解决方案

class CMyClass{};

class CSomeClass{
    static CMyClass* const IMPL;
};

CMyClass* const CSomeClass::IMPL = new CMyClass;

说明

const 在 C++ 中并不是 Java 的 final.

的精确模拟
  • 在 Java 中,final 说明符适用于变量,意味着不能重新分配变量(尽管该变量引用的对象仍然可以修改)。

  • 与此不同,在 C++ 中,const 适用于类型。由于 C++ 有指针,因此区分指针变量本身的类型和该变量将引用的对象的类型很重要。根据您放置 const 的位置,它适用于前者或后者。其他答案对此进行了更详细的阐述。

您必须将 const 放在声明中的正确位置。规则是:const 应用于紧靠左侧的事物,除非它本身位于左边缘,当它应用于右侧时。

因此,这两个是指向常量整数的(可变)指针:

const int * p;
int const * p;

这是一个指向(可变)整数的常量指针:

int * const p;

这些是指向常量整数的常量指针:

const int * const p;
int const * const p;

1) 指向常量元素的指针:const T* ptr

2) 指向可变元素的常量指针:T* const ptr

3) 指向常量元素的常量指针:const T* const ptr

这里你想要的是 2) : const pointer to a mutable element.

C++的'final'与常量无关,是针对虚函数的:表示虚函数是行尾,不会被覆盖。

使用const_cast忽略const并在对象上调用const方法:

const CMyClass* CSomeClass::IMPL = new CMyClass;
const_cast <CMyClass *> (CSomeClass::IMPL) -> someNonConstMethod ();

但是这个"feels"错了;您正试图通过使其保持常量来保护您的变量,因此重写 const 似乎并不是您真正想要的。也许:

  • 不要使用 const 保护变量,而是将成员变量设为私有,这样外部人员就无法修改它们。然后提供访问器函数(非常量)以允许它们以允许的方式进行操作。
  • 如果您有需要从 const 方法更改的成员变量,请将它们标记为 'mutable'。
  • 要防止对象在您的控制之外被删除,请将其析构函数设为私有。