構造函數中這種奇怪的冒號成員(「:」)語法是什麼?

最近,我看到了一個相似如下示例: 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 ++書籍中找不到嗎? 函數


#1樓

這是一個成員初始化列表 。 您應該在任何優秀的C ++書籍中找到有關它的信息。 spa

在大多數狀況下,應該初始化成員初始化列表中的全部成員對象 (可是,請注意FAQ末尾列出的例外)。 code

FAQ條目的重點是, 對象

在全部其餘條件相同的狀況下,若是您使用初始化列表而不是賦值,您的代碼將運行得更快。 get


#2樓

沒錯,這確實是初始化成員變量的一種方法。 除了清楚地代表這是一個初始化以外,我不肯定這有什麼好處。 在代碼中包含「 bar = num」能夠更容易地移動,刪除或誤解。 io


#3樓

我不知道你怎麼會錯過這個,這很基本。 這是初始化成員變量或基類構造函數的語法。 它適用於普通的舊數據類型以及類對象。 class


#4樓

那是構造函數的初始化。 這是初始化類構造函數中成員的正確方法,由於它能夠防止調用默認構造函數。 效率

考慮如下兩個示例: 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

一切都與效率有關。


#5樓

這稱爲初始化列表。 這是初始化類成員的一種方法。 使用此方法有不少好處,而不是簡單地向構造函數主體中的成員分配新值,可是若是您有類成員,這些成員是常量引用,必須對其進行初始化。

相關文章
相關標籤/搜索