2013-04-27 64 views
11

我想知道C++中的一些東西。this-> field和Class :: field之間的區別?

承認以下代碼:

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

裏面我的課,是有this->barFoo::bar之間有什麼區別?有一種情況是無效的嗎?

+2

當然,如果'bar'是一個虛函數,而不是一個數據成員,還有兩者之間的差異。另外請注意,您可以像'this-> Foo :: bar'一樣將它們組合起來。 – dyp 2013-04-27 22:21:44

回答

12

內部類Foo(具體而言)在給定bar不是static的情況下,兩者之間沒有區別。

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

謝謝!我得到了它;) – 2013-04-27 22:14:59

0

對於我已經學會了用C/C++擺弄周圍,使用 - >上的東西主要是爲指針對象,並使用::用於那些命名空間或超類是部分類包括你的任何一般類別

+0

我還沒有看到其中的差別.. – 2013-04-27 22:11:57

+0

那麼,對於::它像使用std ::法院<<「」;使用::意味着你正在使用std命名空間的直接實現,而不是使用namespace std;在你的文件中。 - >就像是「指向」另一個對象的指針。這就是我看到他們使用的方式。 – user2277872 2013-04-27 22:22:35

4

他們做同樣的事情成員。

但是,您將無法使用this->區分同名成員的類層次結構。你將需要使用ClassName::版本來做到這一點。

+3

GCC不同意'這個 - >'不與靜態變量工作:http://ideone.com/N4dSDD – Xymostech 2013-04-27 22:16:54

+0

@Xymostech我感到困惑。 '鐺'也可以接受。感謝您指出。 – pmr 2013-04-27 22:18:37

+1

沒問題。我也有點困惑。 – Xymostech 2013-04-27 22:19:35

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 
} 
相關問題