簡體   English   中英

C ++構造函數初始化列表奇怪

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM