2011-05-10 55 views
13

可能重复:
Why isn't the const qualifier working on pointer members on const objects?为什么C++不对指针数据强制执行const?

考虑具有指针构件int *a下面的类。编译器允许const方法constMod,即使它修改指针数据。为什么编译器不会在const方法的上下文中使指针数据为常量?如果a只是一个int,我们不会允许在const方法中修改它。

class ConstTest 
{ 
    public: 

    ConstTest(int *p): a(p) {} 

    void constMod() const { 
     ++(*a); 
    } 

    int *a; 
}; 

我在linux上使用g ++。

+0

唯一的答案就是“因为是这样的”,但我想我们大多数人同意它通常是意外(起初),尽管人们可以事后找理由。 – 2011-05-10 06:33:23

+0

C++默认给出了一个所谓的二进制位常量性 - 这意味着它可以确保对象的无单位已经改变,所以它只是检查指针 – rank1 2014-04-30 16:02:52

回答

4

这只是一个所有权问题......编译器无法知道所指向的对象是否在逻辑上是对象的一部分,因此它让程序员来监视这些问题。 const成员被允许执行带有副作用的操作,只要他们不修改自己的表观值。与让他们打电话说std::cout::operator<<()或其他一些非const函数没什么两样。

13

constMod()a声明作为处理:

int *const a; 

这意味着指针具有恒定值,而不是什么。这听起来像你期望它被作为治疗:

const int *a; 

这是不同的。

+1

的地址是没有回答它没有澄清的问题...? – 2011-05-10 05:27:35

+0

那为什么呢?为什么不在const方法中强制执行const的所有内容?看起来奇怪的是将指针数据视为副作用。 – MattSmith 2011-05-10 05:42:32

+0

@Matt:C++就是这样。想象一下,它是一个整数而不是一个指针,你不能改变整数。这个整数意味着你*与它的价值无关。 (这可能是一个计数器,年龄等)。同样,一个指针值无关,与它指向的(我们只是碰巧同意,指针值指示的地址,所有的时间,而不是像各种各样的东西一个整数可以;但类比仍然成立)。对于它的价值,D语言的行为就像你期望的那样。 – GManNickG 2011-05-10 06:03:43

7

指针本身没有修改,只有数据指出。即使从人的角度来看这听起来很奇怪,但从编译器的角度来看,这个类的成员都不会被改变。

0

在上述情况下const是什么,指针本身。你不能做++a;。但是,它并不妨碍您修改指向的数据

0

我相信因为在这里你试图改变datamember指向的值。 如果您尝试修改数据成员,则会出错。

意义,因此当你做点别的东西,而不是改变值

0

const成员函数不会允许你修改它的成员得到错误。

在你的例子中,你有一个指向int的指针。

而在const方法中,您正在修改它指向的值,但不修改指针本身。

尝试给予,++a,它实际上会修改指针值,并且不会在您的const方法中被允许。

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

相关问题