2012-01-09 71 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

相關問題