2012-01-09 15 views
26

Kod idzie pierwszy:Czy funkcja członkowska can const zwraca wskaźnik niestały do ​​elementu danych?

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

Funkcja członkiem foo zwraca non-const wskaźnik do private członka _px, który, jak sądzę, otwiera drzwi do modyfikowania członkiem _px, prawda?

Czy foo jest funkcją członka? Czy przed typem zwracania należy dodać wartość const?

UPDATE

Co const państwie funkcja powinna gwarantować to, że nie można zmieniać żadnych danych-member, prawda?

W moim przypadku, funkcja foo nie otwiera drzwi do modyfikowania danych class A s-członek _px, ale drzwi do modyfikowania co _px wskazując, więc moje pytanie brzmi, czy to, co narusza const funkcja powinna gwarantować ?

+1

Co mówi kompilator z włączonym ostrzeżeniem? – Arunmu

+2

@ArunMu gcc 4.6.1 nic nie mówi. – jrok

+0

@ArunMu, cóż, wydaje się niczym. – Alcott

Odpowiedz

27

Funkcja członkowska może zwrócić tylko wskaźnik lub odniesienie const do elementu.

Jednak Twój przykład nie zwraca wskaźnika do elementu; zwraca kopię członka, który jest wskaźnikiem. Jest to dozwolone w funkcji składowej const (nawet jeśli wskaźnik wskazuje na inny element).

nie będą mogły (zauważ, że to teraz powrocie odniesienie):

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

ale to (wracając do const odniesienia):

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

Panie, twoje wyjaśnienie jest całkiem jasne i słuszne. IMO, 'foo' w' klasie A' otwiera drzwi do modyfikowania tego, do czego wskazuje '_px', co, jak sądzę, powoduje, że' foo' jest funkcją stałą, prawda? – Alcott

+0

@Alcott: 'const' na funkcji składowej tylko chroni elementy samego obiektu, a nie żadne dalsze poziomy pośrednie. Więc w ramach funkcji '_px' jest faktycznie' int * const'; sam wskaźnik nie może być modyfikowany, ale może to być jego cel. –

4

int *_px staje int *const _px wewnątrz const członka Funkcja ta oznacza, że ​​wskaźnika nie można ponownie wstawić, ale wskazane dane nadal można modyfikować. Ponadto twoja funkcja zwraca kopię wskaźnika, więc i tak nie ma to znaczenia.

1

Tak, w twoim przypadku może. Jednakże, jest to na ogół nie zaleca się tego robić, ponieważ pozwala na zmianę stałych obiektów:

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

on nie otwiera drzwi do modyfikowania _px ale raczej co _px punktów. To Ty decydujesz, czy chcesz na to zezwolić, czy nie.

Na przykład: zwróci wskaźnik niestały, a const_iterator::operator-> zwróci wskaźnik const. Obie metody mogą być same w sobie.

+0

Tak, otwiera drzwi do modyfikowania, do czego wskazuje '_px'. – Alcott

Powiązane problemy