[英]C++ Constructor initialization list strangeness
在編寫我的類時,我總是一個好孩子,用m_作為所有成員變量的前綴:
class Test {
int m_int1;
int m_int2;
public:
Test(int int1, int int2) : m_int1(int1), m_int2(int2) {}
};
int main() {
Test t(10, 20); // Just an example
}
然而,最近我忘記這樣做了,最后寫了:
class Test {
int int1;
int int2;
public:
// Very questionable, but of course I meant to assign ::int1 to this->int1!
Test(int int1, int int2) : int1(int1), int2(int2) {}
};
信不信由你,編譯的代碼沒有錯誤/警告,並且分配正確! 只有在檢查我的代碼之前進行最后檢查時才意識到我做了什么。
我的問題是:為什么我的代碼編譯? 在C ++標准中是否允許這樣的東西,還是僅僅是編譯器聰明的情況? 如果您想知道,我使用的是Visual Studio 2008
是的,它是有效的。 成員初始化列表中的名稱在構造函數的類的上下文中查找,因此int1
查找成員變量的名稱。
初始化表達式在構造函數本身的上下文中查找,因此int1
找到掩蓋成員變量的參數。
你所做的是標准的C ++。 只有成員變量或基類可以在初始化列表中初始化,因此在paranthesis之外的變量是明確的。 在括號內,典型的范圍規則適用,並且成員被參數名稱所掩蓋。
這是完全正常的行為。 正如AAT正確指出的那樣,沒有歧義。 列表初始化的變量必須是類成員。 這是標准的,適用於所有兼容的編譯器。
使用這樣的列表時唯一要記住的是,不理解這種代碼的人可能必須維護它。 只要您知道自己在做什么,編寫這樣的初始化代碼就沒有錯。
我想這是有效的,因為你在初始化列表中使用int1,並且你可以初始化的唯一的東西是成員變量=>事實上,這是一個明確無誤的變量。
是否所有C ++編譯器都是這種寬容是另一回事!
你做的是正常的。 這種實現避免了你甚至使用'this'指針(在這種情況下)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.