2016-09-28 5 views
3

私の理解では、私は、変数であることを示すのアイデアが好き、私はクラスC++本とクラス間のクラスの違い::

class MyClass { 
    public: 
     MyClass(); 
     void SetVal(int); 
    private: 
     int val_; 
} 

を持っている場合、私はメンバー

MyClass::SetVal(int val) { val_ = val } 

MyClass::SetVal(int val) { MyClass::val_ = val } 

MyClass::SetVal(int val) { this->val_ = val } 

を参照することができるということですクラスメンバー。 2番目と3番目のアプローチに違いはありますか?

EDIT:made SetVal(int)public。この例を書き留めるには躊躇しました。指摘ありがとう

+0

また、SetValを非公開にする必要があります。 –

+1

_ "私は、変数がクラスメンバーであることを示す考えが好きです" _ - メンバーに接尾辞 '_'を付けることで既にそうしているようです。追加の 'this->'または 'MyClass ::'は余分な明快さを加えません。 – emlai

+1

メンバ変数の命名規則を使用せずに 'm_variable_name'を使うと、クラスメンバにアクセスしていることを簡単に知りたいのですが? – NathanOliver

答えて

3

実際に違いがあります!...

これ、

MyClass::SetVal(int val) { val_ = val } 

unqualified name lookupん。そのname lookupの事。最初にval_がクラススコープ内で最初に検索され、見つからなければ、名前検索namespaceval_の検索をグローバルに実行します。 example here


これ、

MyClass::SetVal(int val) { MyClass::val_ = val } 

qualified name lookupありません。 val_は、厳密にはclass namespaceに制限されています。そのようなメンバーval_を持っていなければ、グローバルネームスペースをさらに検索することはありません。別のexample here


これ、

MyClass::SetVal(int val) { this->val_ = val } 

は、第二に似ています。 example here

0
MyClass::SetVal(int val) { MyClass::val_ = val } 

これは '静的'(あなたの例では使用されていません)に使用されています。静的は、クラスのすべてのインスタンスに共通です。真実を伝えるために、Propper宣言でClassName ::は必須ではありませんが、それにもかかわらず受け入れられます。

MyClass::SetVal(int val) { this->val_ = val } 

単語は「これは」

3

(おそらく現実にあなたがSetValpublicまたはprotectedをマークしたい。)

を必要とされていませんが、あなたは、インスタンスフィールドのval_にアクセスするためにこれを使用coud

私はval_ = valが一番きれいだと思いますが、あなたの特定のケースには全く違いはありません。 this->はトートロジーであることに注意してください。

シャドーのクラスメンバー間で、同じ名前のクラスメンバーを持つ基本クラスと子クラスを区別するために、MyClass::val_表記を使用できます。

関連する問題