如何在 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'。
- 要防止对象在您的控制之外被删除,请将其析构函数设为私有。
如何在 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'。
- 要防止对象在您的控制之外被删除,请将其析构函数设为私有。