可能重复:
Why isn't the const qualifier working on pointer members on const objects?
考虑以下具有指针成员int *a
的类。编译器允许使用const方法constMod
,即使它修改了指针数据。为什么编译器不在const方法的上下文中使指针数据为const?如果a
只是一个int,我们就不允许在const方法中修改它。
class ConstTest
{
public:
ConstTest(int *p): a(p) {}
void constMod() const {
++(*a);
}
int *a;
};
我在linux上使用g ++。
答案 0 :(得分:13)
在constMod()
内,a
的声明被视为:
int *const a;
表示指针具有常量值,而不是指向的值。听起来你希望它被视为:
const int *a;
这是不同的。
答案 1 :(得分:7)
指针本身未被修改,只有指向的数据。从人类的角度来看,即使听起来很奇怪,但从编译器的角度来看,类的成员都没有被改变。
答案 2 :(得分:4)
这只是一个所有权问题......编译器无法知道指向对象是否在逻辑上是对象的一部分,所以它留给程序员来监控这些问题。允许const
成员执行副作用操作,只要他们不修改自己的表观值即可。与让他们称之为std::cout::operator<<()
或其他一些非常规函数并没有什么不同....
答案 3 :(得分:0)
上述情况中的const是指针本身。您不能执行++a;
。但是,它不会阻止您修改指向的数据。
答案 4 :(得分:0)
我相信因为您在这里尝试更改datamember所指向的值。 如果您尝试修改数据成员,则会出错。
意思是,如果你指出别的东西而不是改变值
,你会得到错误答案 5 :(得分:0)
const
成员函数不允许您修改其成员。
在您的示例中,您有一个指向int的指针。
在const
方法中,您正在修改指向的值,而不是指针本身。
尝试给予++a
,这将实际修改指针值,并且不会在const
方法中允许。
答案 6 :(得分:0)
考虑
const T immutable_object0;
const T immutable_object1;
const T* mutable_view = ...a condition... ? &immutable_object0 : &immutable_object1;
// then later you reseat
mutable_view = ...another condition... ? &immutable_object0 : &immutable_object1;
或
const int immutable_data[120]
const int* mutable_view = immutable_data;
for(const int* end = immutable_data + 120; mutable_view != end; ++mutable_view) {
// can't modify *mutable_view
}
这是因为指针并不总是拥有所有权。在某些情况下,指针是对象的视图(第一个示例),或者是原始数组中的迭代器(第二个示例)。对于那些情况,限制指针上的可用操作是没有意义的,因为指向的数据是不可变的(或看作不可变的)。
第一个例子有点做作,但它的有效版本是当你使用指针成员实现对象关联而你不想要引用成员的麻烦时。有时,指向类型恰好是const
。