假设你有一个类:
现在,您可能希望定义该类的常量实例。
但是这将失败,因为非const int C的构造函数C(int * v)。
所以你需要定义一个const int构造函数。
在这种情况下,语法将
解决方法是定义两个类
在两种情况下,我应该将不修改指针目标的方法标记为const吗?还是只需遵循传统路径,即const方法本身不会更改对象的状态(const方法不关心指针目标)。然后在我的情况下,所有方法都将是const,因为类正在模拟一个指针,因此指针本身是
class C
{
int * i;
public:
C(int * v):i(v) {};
void method() const; //this method does not change i
void method(); //this method changes i
}
现在,您可能希望定义该类的常量实例。
const int * k = whatever;
const C c1(k); //this will fail
但是这将失败,因为非const int C的构造函数C(int * v)。
所以你需要定义一个const int构造函数。
C(const int * v):i(v) {}; //this will fail also
但是这也会失败,因为C的成员“int * i”是非const的。
在这种情况下应该怎么办?使用mutable?强制转换?准备类的const版本?
编辑:在与Pavel(下面)的讨论后,我对这个问题进行了一些调查。对我来说,C++所做的并不正确。指针目标应该是一个严格的类型,这意味着您不能执行以下操作:
int i;
const int * ptr;
ptr = & i;
在这种情况下,语法将
const
视为不更改指针目标的承诺。另外int * const ptr
也是一个承诺,不更改指针值本身。因此,您可以应用两个地方的const。然后您可能希望您的类模拟一个指针(为什么不呢)。在这里,事情开始变得复杂。C++语法提供了const方法,能够承诺不更改字段值本身,但却没有语法来指出您的方法不会更改您内部类指针的目标。解决方法是定义两个类
const_C
和C
等。这并不是一个最优路线。使用模板和其部分特化很容易陷入混乱。而且所有可能的参数变化,例如const const_C & arg
,const C & arg
,const_C & arg
,C & arg
看起来都不是很美观。我真的不知道该怎么办。使用单独的类或const_casts,每种方式似乎都是错误的。在两种情况下,我应该将不修改指针目标的方法标记为const吗?还是只需遵循传统路径,即const方法本身不会更改对象的状态(const方法不关心指针目标)。然后在我的情况下,所有方法都将是const,因为类正在模拟一个指针,因此指针本身是
T * const
。但明显有些方法会修改指针的目标,而其他方法则不会。
mutable
在这里不起作用,因为它只适用于字段本身,而不适用于它们所指向的内容。 - Pavel Minaev