簡體   English   中英

C ++這個很少使用的構造函數語法是什么?

[英]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 ++很大)
  • 確實有效
  • 無論是否定義了構造函數, 都可以工作 ,因此可能是默認行為

我的問題是:

  • 這個語法是否有一個名稱和特定目的,它將它與常規構造函數行為區分開來,如果是這樣,為什么要使用它(或不使用它)?

自從引入C ++ 11以來,情況發生了變化,您應該閱讀有關列表初始化的內容

int x (0);  // Constructor initialization
int x {0};  // Uniform initialization

在介紹之前,您有各種初始化案例:

  • 通過調用normal()構造函數來對象(如果沒有參數,則注意最煩惱的解析
  • 使用{}聚合類或數組
  • 默認構造沒有大括號

現在,您可以在所有這些中使用統一初始化。

必須指出的是,這兩者之間並不是真正可以互換的

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.

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