最近,我看到了一個相似如下示例: ios
#include <iostream> class Foo { public: int bar; Foo(int num): bar(num) {}; }; int main(void) { std::cout << Foo(42).bar << std::endl; return 0; }
這個奇怪的: bar(num)
是什麼意思? 它彷佛以某種方式初始化了成員變量,但我以前從未見過這種語法。 它看起來像一個函數/構造函數調用,但要使用int
嗎? 對我來講毫無心義。 也許有人能夠啓發我。 並且,順便說一句,還有其餘任何深奧的語言功能,在普通的C ++書籍中找不到嗎? 函數
這是一個成員初始化列表 。 您應該在任何優秀的C ++書籍中找到有關它的信息。 spa
在大多數狀況下,應該初始化成員初始化列表中的全部成員對象 (可是,請注意FAQ末尾列出的例外)。 code
FAQ條目的重點是, 對象
在全部其餘條件相同的狀況下,若是您使用初始化列表而不是賦值,您的代碼將運行得更快。 get
沒錯,這確實是初始化成員變量的一種方法。 除了清楚地代表這是一個初始化以外,我不肯定這有什麼好處。 在代碼中包含「 bar = num」能夠更容易地移動,刪除或誤解。 io
我不知道你怎麼會錯過這個,這很基本。 這是初始化成員變量或基類構造函數的語法。 它適用於普通的舊數據類型以及類對象。 class
那是構造函數的初始化。 這是初始化類構造函數中成員的正確方法,由於它能夠防止調用默認構造函數。 效率
考慮如下兩個示例: stream
// Example 1 Foo(Bar b) { bar = b; } // Example 2 Foo(Bar b) : bar(b) { }
在示例1中:
Bar bar; // default constructor bar = b; // assignment
在示例2中:
Bar bar(b) // copy constructor
一切都與效率有關。
這稱爲初始化列表。 這是初始化類成員的一種方法。 使用此方法有不少好處,而不是簡單地向構造函數主體中的成員分配新值,可是若是您有類成員,這些成員是常量或引用,則必須對其進行初始化。