2012-01-09 11 views
26

コードは、最初に行く:constメンバ関数がデータメンバへの非constポインタを返すことはできますか?

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

右、メンバー_pxを変更への扉を開いて、私が思うに、privateメンバー_pxに非constポインタを返すfooメンバ関数?

fooconstメンバー機能はありますか?戻り値の型の前にconstを追加する必要がありますか?何のconstメンバ関数を保証すべきである

UPDATE

は右、それは任意のデータ・メンバーを変更することはできません、ということでしょうか?私の場合は

、機能fooclass A sのデータ・メンバー_pxが、_pxが指して何の変更への扉を修正への扉を開いていない、だから私の質問があり、これはconstの機能を保証すべきである何を違反しません?

+1

コンパイラは警告を有効にして何を言っていますか? – Arunmu

+2

@ArunMu gcc 4.6.1は何も言いません。 – jrok

+0

@ArunMuは、まあ、何もないようです。 – Alcott

答えて

27

constメンバ関数は、constメンバへのポインタまたは参照のみを返すことができます。

しかし、あなたの例ではメンバーへのポインタは返されません。それはポインターであるメンバーのコピーを返しています。これは、ポインタが別のメンバーを指している場合でも、メンバー関数constで許可されます。

これは(それが今の参照を返すということに注意してください)許可されません。

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

が、これは(const参照を返す)になります。

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

先生、あなたの説明はかなり明確で正しいです。 IMO、 'class A 'の' foo'は '_px'が指し示すものを修正するための扉を開きます。これは' foo'を非constメンバ関数にしているのでしょうか? – Alcott

+0

@Alcott:メンバ関数の 'const'は、オブジェクト自身のメンバだけを保護し、さらなる間接レベルは保護しません。したがって、 '_px'関数内では' int * const'が効果的です。ポインタ自体は変更できませんが、そのターゲットは変更できます。 –

4

int *_pxはconstメンバの内側int *const _pxなりこれは、ポインタを再配置することはできないが、指し示されたデータは依然として変更可能であることを意味する。さらに関数はポインタのコピーを返しますので、とにかく問題はありません。

1

はい、可能です。しかし、それは一定のオブジェクトを変更することができますので、それは一般的に、これを実行しないように助言しています:

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

それはに_pxではなく、何_pxポイントを修正することへの扉を開きません。これを許可するかどうかは、あなた次第です。

たとえば、iterator::operator->は非constポインタを返し、const_iterator::operator->はconstポインタを返します。どちらのメソッドもconst自体である可能性があります。

+0

はい、 '_px'が指し示すものを修正するためのドアを開きます。 – Alcott

関連する問題