2013-04-27 7 views
11

私はC++で何か不思議です。次のコードを認めるthis-> fieldとClass :: fieldの違いは?

:私のクラスインサイド

int bar; 
class Foo 
{ 
public: 
    Foo(); 
private: 
    int bar; 
}; 

は、this->barFoo::barの間に違いはありますか? 1つが無効な場合がありますか?

+2

'bar'は、仮想関数の代わりにデータメンバーである場合、2つの違いはあります。また、 'this-> Foo :: bar'のように組み合わせることもできます。 – dyp

答えて

12

内部クラスFoo(具体的には、barstaticではありません)の違いはありません。

Foo::barは、完全修飾名のbarと呼ばれ、同じ名前のメンバーを定義する階層に複数のタイプが存在する場合に便利です。たとえば、ここFoo::barを書くためにが必要になります

class Foo 
{ 
    public: Foo(); 
    protected: int bar; 
}; 

class Baz : public Foo 
{ 
    public: Baz(); 
    protected: int bar; 

    void Test() 
    { 
     this->bar = 0; // Baz::bar 
     Foo::bar = 0; // the only way to refer to Foo::bar 
    } 
}; 
+0

ありがとう!私はそれを持っている;) –

0

私がC/C++で勉強したことについては、何かの上で - >を使うのは主にポインタオブジェクトのためのもので、::は名前空間やスーパークラスの一部であるクラスに使われます

+0

私はまだ違いが表示されません。 –

+0

これは、:: std :: cout << ""; ::を使用すると、using namespace stdの代わりにstd名前空間の直接実装を使用していることを意味します。あなたのファイルに。 - >は、別のオブジェクトへのポインタを「指している」ようなものです。それは私がそれらが使用されているのを見た方法です。 – user2277872

4

彼らは同じことのメンバーを行います。

しかし、this->を使用して、クラス階層内の同じ名前のメンバーを区別することはできません。これを行うには、ClassName::バージョンを使用する必要があります。

+3

gccは静的変数で 'this->'が動作しないと不一致です:http://ideone.com/N4dSDD – Xymostech

+0

@Xymostech私はうんざりです。 'clang'もそれを受け入れます。それを指摘してくれてありがとう。 – pmr

+1

問題ありません。私も少しconfuzzledです。 – Xymostech

0

同じ名前の別のクラス(ほとんどの場合、基本クラス)の変数を参照することもできます。私にとっては、この例から明らかですが、それがあなたに役立つことを願っています。

#include <iostream> 
using std::cout; 
using std::endl; 

class Base { 
public: 
    int bar; 
    Base() : bar(1){} 
}; 

class Derived : public Base { 
public: 
    int bar; 

    Derived() : Base(), bar(2) {} 

    void Test() { 
     cout << "#1: " << bar << endl; // 2 
     cout << "#2: " << this->bar << endl; // 2 
     cout << "#3: " << Base::bar << endl; // 1 
     cout << "#4: " << this->Base::bar << endl; // 1 
     cout << "#5: " << this->Derived::bar << endl; // 2 
    } 
}; 

int main() 
{ 
    Derived test; 
    test.Test(); 
} 

クラスに保存されている実際のデータは、このようなものですので、これはされています。もちろん

struct { 
    Base::bar = 1; 
    Derived::bar = 2; // The same as using bar 
}