[英]C++ what is this little used constructor syntax?
編輯:我不認為這一個重復此另一個問題 ,因為其他問題,只需調換()
為{}
在構造函數。 我注意到在結構中定義構造struct
但在class
沒有定義構造函數時的不同行為。 (並且,正如評論中所指出的,這是關於使用構造函數而不是編寫它們。)但我以前錯了。
在輔導時,我遇到了構造函數的這種奇怪的(對我而言)語法:
Foo obj {i, j};
起初我以為它不會起作用,並告訴學生重寫它 - 但是他們堅持認為它有效,並告訴我他們從cplusplus.com中取出了我無法找到參考的例子,所以無論如何我都試過了......它有效。 所以我試驗了它。
我自己也研究了一下,發現在cplusplus.com上沒有引用那種構造函數語法 。 (也許它有一個特定的名字?)
以下是我嘗試使用它的方法。
struct Note { //A musical note.
std::string name;
double freq;
//Note(std::string s, double f): name(s), freq(f){}
//Uncomment the constructor in order to use normal constructor syntax.
};
class Journal {
public:
std::string title;
std::string message;
int idNum;
};
int main() {
Note a { "A", 440.0}; //Works with or without a constructor.
//Note a("A",440.0); //Works ***only*** with a defined constructor.
//Journal journal("hello, world", "just me, a class", 002); //Works regardless of constructor definition.
Journal journal {"hello, world", "just me, a class", 003}; //Works regardless of constructor definition.
std::cout << a.name << " " << a.freq << std::endl;
std::cout << journal.title << " " << journal.message << " " << journal.idNum << std::endl;
return 0;
}
我發現它適用於結構和類,無論它們是否具有已定義的構造函數。
顯然默認的構造函數正在運行,但由於以下幾個原因,這讓我很困惑:
我的問題是:
自從引入C ++ 11以來,情況發生了變化,您應該閱讀有關列表初始化的內容
int x (0); // Constructor initialization
int x {0}; // Uniform initialization
在介紹之前,您有各種初始化案例:
現在,您可以在所有這些中使用統一初始化。
必須指出的是,這兩者之間並不是真正可以互換的
std::vector<int> v (100); // 100 elements
std::vector<int> v {100}; // one element of value 100
並且你必須注意這樣一個事實:如果類型有一個初始化列表構造函數 ,它將優先於重載解析。
也就是說,統一初始化可以非常方便和安全(防止縮小轉換)。
該語法稱為“列表初始化”。 您可以在C ++ 14的第8.5.4節中閱讀更多相關內容。
我猜這個語法主要是為了向后兼容C,它有初始化結構和類似的語法,看起來非常相似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.