2012-01-09 77 views
26

代码先行:可以const成员函数返回一个非常量指针给数据成员?

class A 
{ 
    public: 
     ... 
     int *foo() const 
     { 
      return _px; 
     } 
    private: 
     int *_px; 
} 

成员函数foo返回一个非const指针private成员_px,其中,我认为,打开门来修改构件_px,对不对?

foo一个const成员函数?我应该在返回类型前添加const吗?

UPDATE

什么一个const成员函数应该保证的是,它不能改变任何数据成员,对不对?

在我的情况下,功能foo没有打开大门修改class A s的数据成员_px,但一进门就改变什么_px指向,所以我的问题是,这是否违反了一个const功能应能保证什么?

+1

编译器在启用警告时说了些什么? – Arunmu 2012-01-09 13:08:03

+2

@ArunMu gcc 4.6.1什么也没说。 – jrok 2012-01-09 13:09:34

+0

@ArunMu,好吧,没什么。 – Alcott 2012-01-09 13:12:34

回答

27

const成员函数可以在const指针或引用仅返回的部件。

但是,您的示例没有返回指向成员的指针;它返回一个恰好是指针的成员的副本。这是在const成员函数中允许的(即使指针碰巧指向另一个成员)。

这是不允许的(请注意,它现在返回参考):

int *& foo() const {return _px;} 

但这(返回const参考):

int * const & foo() const {return _px;} 
+0

先生,你的解释非常明确,正确。国际海事组织,'A级'中的'foo'打开了修改指向'_px'的门,我认为这使得'foo'成为一个非const成员函数,对吧? – Alcott 2012-01-09 13:25:18

+0

@Alcott:成员函数的'const'只保护对象本身的成员,而不是任何更深层次的间接。所以在函数中'_px'实际上是'int * const';指针本身无法修改,但其目标可以。 – 2012-01-09 13:47:19

4

int *_px成为int *const _px一个const成员内部函数这意味着指针不能被重新设置,但指向的数据仍然是可修改的。进一步你的函数返回指针的副本,所以它无论如何不重要。

1

是的,你的情况可以。然而,它通常建议不要这样做,因为它允许改变常量对象:

void f(const A& a) 
{ 
    *(a.foo()) = 42; // damn! 
} 
3

它不会打开大门修改_px而是什么_px点。这取决于你是否要允许这一点。

例如,iterator::operator->会返回一个非const指针,而const_iterator::operator->会返回一个const指针。两种方法本身都可以是const。

+0

是的,它打开了修改'_px'指向的门。 – Alcott 2012-01-09 13:19:37