2013-05-10 49 views
0

當定義一個類cls時,在cls的自定義中使用它們時,是否有必要(或好的做法)將類名稱cls::加到成員的前面,還是隱式完成?例如。類的成員是否需要在類定義中加入`class ::`的前綴?

class cls { 
    int x; 
    void foo(); 
    void bar(); 
} 
void cls::foo() { 
    x++; // or use cls::x? 
    bar(); // or cls::bar()? 
} 

如果是這樣,那麼就創建一個類cls自動意味着它也是一個命名空間(因爲我以爲::運營商只與命名空間中使用)?

編輯(跟進): 如果我們不使用cls::this->,那麼如果我的消息人士還具有可變x外班? cls::foo()怎麼知道哪一個x++指的是?

+1

在'x'等成員變量的名稱前加上'm_'(即'm_x')通常是比較常見的。這有助於將局部變量與類成員區分開來,從而消除了爲什麼您可能希望以類名 – 2013-05-10 13:20:14

回答

1

你看上面的代碼定義一類,但最初只聲明成員函數(然後定義他們只是事後)。我只提到這一點,因爲術語對有效溝通很重要。

如果你定義的類成員在線,那麼你不使用範圍解析操作::,例如:

class cls { 
    void hello() { cout << "Hello world"; } 
}; 

如果單獨定義它們,那麼你需要它,否則編譯器不能確切地知道你打算定義什麼功能:

class cls { 
    void hello(); 
}; 

void cls::hello() { cout << "Hello world"; }; 

一般來說,範圍解析運算符的使用爲n不限於使用名稱空間;只要需要向編譯器提供標準名稱,就可以使用它。

在大多數情況下從類作用域內訪問類成員時,可以使用它們的非限定名稱;編譯器將自行解決它們。因此,例如,在代碼中所有這些都是等價的:

x++; 
cls::x++; 
this->x++; 
this->cls::x++; // yes, this too 

您需要限定,只要有名稱相同的多個成員的姓名和編譯器解析不合格的名稱比你預期的成員以外的東西。實例:

void cls::foo(int x) { 
    x++;  // increments the argument 
    cls::x++; // increments the member 
    this->x++; // also increments the member 
} 

考慮也是cls可以從base派生,並且base還可以限定一個x。在這種情況下,它的工作原理是這樣的:

void cls::foo() { 
    x++;  // increments foo::x 
    cls::x++; // increments foo::x 
    base::x++; // increments base::x 
} 
1

Nop。至少不會那樣。

您可以使用this->使讀者更清楚。但是::是不同的事情。它用於訪問靜態成員變量或函數。

int x;     // Global x 
namespace ot { int x; } // another x 
class cls { 
    int x;    // Normal member 
    static int y;  // Static member 
    void foo(); 
    static void bar(); // Static member function 
} 
void cls::foo() { 
    this->x++; // Modify own x. 
    x++   // Modify own x. This has implicit this-> 
    ::x++;  // Modify the global x. 
    ot::x++;  // Modify the x in namespace ot. 
    cls::y++;  // modify the static member 
    cls::bar(); // static member function. same as bar() 
} 
+0

來確定成員範圍的一個原因。那麼,如果我的源在類之外還有一個變量'x',該怎麼辦呢?如果我們不使用'this',cls :: foo()如何知道'x ++'指的是哪一個? – mchen 2013-05-10 13:13:07

+0

'::'_can_可與非靜態數據和函數成員一起使用,並可用於禁用虛擬分派。 – 2013-05-10 13:13:56

+0

@MiloChen它將始終使用該類自己的x。查看編輯 – stardust 2013-05-10 13:15:10

2

明確限定成員變量的使用與類名是一個壞主意。充其量,這是沒有必要的(或者在必要時,this-> member更好),並禁止重構(如果您重命名類,則更多地方需要更改),最壞的情況是它會引入錯誤,因爲對虛擬函數的限定調用不會調度爲重載版本。

相關問題