亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C-like,構造函數和統一初始化之間有什么區別?

C-like,構造函數和統一初始化之間有什么區別?

C++
開滿天機 2019-08-17 16:28:18
C-like,構造函數和統一初始化之間有什么區別?據我所知,有三種方法可以在C ++中初始化變量。int x = 0;    // C-like initializationint x (0);    // Constructor initializationint x {0};    // Uniform initialization為C ++ 11引入了統一初始化,以便為初始化不同類型的變量提供更加統一的語法,這需要在C ++ 03中使用不同的語法。C-like,構造函數和統一初始化之間有什么區別?我應該總是使用統一初始化嗎?
查看完整描述

2 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

c-like,構造函數和統一初始化之間有什么區別?


對于原始類型int,沒有實際的區別; 所以讓我們考慮一個類類型T。


第一種風格相當于


T x(T(0));

從初始化表達式創建臨時對象,然后x通過移動或復制它來初始化。在實踐中,移動或復制將被省略,因此結果與第二種風格相同; 唯一的區別是,如果沒有可訪問的副本或移動構造函數,第一個將失敗。


第二個使用帶有一個參數的構造函數直接初始化對象,如果沒有合適的構造函數則給出錯誤。


第三個取決于可用的構造函數。


如果有一個構造函數std::initializer_list,它會使用它;

否則,如果有一個構造函數采用合適類型的單個參數,它會使用它;

否則,如果它是具有一個成員的聚合(沒有構造函數),則該成員初始化為零;

否則,這是一個錯誤。

我應該總是使用統一初始化嗎?


沒有。有時您需要函數式初始化來區分initializer_list構造函數和采用其他參數類型的構造函數。例如:


std::vector<int> v1(10, 42);  // 10 elements with value 42

std::vector<int> v2{10, 42};  // 2 elements with values 10 and 42

你也不應該稱它為“統一初始化”,因為它在任何有意義的意義上都不是“統一的”。官方術語是“支撐初始化”。


查看完整回答
反對 回復 2019-08-17
  • 2 回答
  • 0 關注
  • 727 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號