如何在C ++中定义一个指向可变对象的常量?
如果我宣布
static const CMyClass* IMPL;
并指定
const CMyClass* CSomeClass::IMPL = new CMyClass;
然后我只能在对象上调用const
个函数。它的内部是锁定的。这不是我想要的。
如果我不使用const
限定符,我可以重新指定指针IMPL
,因此它不再被保护为常量,它应该是。 final
似乎只适用于C ++中的函数。在C ++中是否有等同于Java的final
变量?
答案 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;
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看起来并不像你真正想要的那样。也许: