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

时间:2016-09-09 12:02:24

标签: c++ final

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

如果我宣布

static const CMyClass* IMPL;

并指定

const CMyClass* CSomeClass::IMPL = new CMyClass;

然后我只能在对象上调用const个函数。它的内部是锁定的。这不是我想要的。

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

4 个答案:

答案 0 :(得分:9)

您必须将const放在声明中的正确位置。规则是:const适用于左边的东西,除非它适用于右边的左边缘。

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

const int * p;
int const * p;

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

int * const p;

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

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

答案 1 :(得分:7)

解决方案

class CMyClass{};

class CSomeClass{
    static CMyClass* const IMPL;
};

CMyClass* const CSomeClass::IMPL = new CMyClass;

解释

C ++中的

const不是Java final的精确模拟。

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

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

答案 2 :(得分:5)

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

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

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

你想要的是2):指向可变元素的const指针。

答案 3 :(得分:0)

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

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

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

但这&#34;感觉&#34;错误;你试图通过使变量保持不变来保护你的变量,所以重写const看起来并不像你真正想要的那样。也许:

  • 不使用const保护变量,而是将成员变量设为私有,以便外人可以修改它们。然后提供访问器函数(非const)以允许它们以允许的方式进行操作。
  • 如果您有需要从const方法更改的成员变量,请将它们标记为&#39; mutable&#39;。
  • 要保护对象不被删除,请将其析构函数设为私有。