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

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

在C ++ 11中,pass-by-value是一個合理的默認值嗎?

在C ++ 11中,pass-by-value是一個合理的默認值嗎?

C++
弒天下 2019-08-06 14:29:48
在C ++ 11中,pass-by-value是一個合理的默認值嗎?在傳統的C ++中,將值傳遞給函數和方法對于大型對象來說是很慢的,并且通常不贊成。相反,C ++程序員傾向于傳遞引用,這更快,但它引入了圍繞所有權的各種復雜問題,特別是圍繞內存管理(如果對象是堆分配的)現在,在C ++ 11中,我們有Rvalue引用和移動構造函數,這意味著可以實現一個大的對象(比如一個std::vector),它可以通過值傳入和傳出函數。那么,這是否意味著默認值應該是傳遞類型實例的值,例如std::vector和std::string?自定義對象怎么樣?什么是新的最佳做法?
查看完整描述

3 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

在幾乎所有情況下,您的語義都應該是:


bar(foo f); // want to obtain a copy of f

bar(const foo& f); // want to read f

bar(foo& f); // want to modify f

所有其他簽名應該只是謹慎使用,并且有充分的理由。編譯器現在幾乎總是以最有效的方式解決這些問題。您可以繼續編寫代碼!


查看完整回答
反對 回復 2019-08-06
?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

如果在函數體內部需要對象的副本或者只需要移動對象,則按值傳遞參數。const&如果您只需要對對象進行非變異訪問,則傳遞。


對象復制示例:


void copy_antipattern(T const& t) { // (Don't do this.)

? ? auto copy = t;

? ? t.some_mutating_function();

}


void copy_pattern(T t) { // (Do this instead.)

? ? t.some_mutating_function();

}

對象移動示例:


std::vector<T> v;?


void move_antipattern(T const& t) {

? ? v.push_back(t);?

}


void move_pattern(T t) {

? ? v.push_back(std::move(t));?

}

非變異訪問示例:


void read_pattern(T const& t) {

? ? t.some_const_function();

}


查看完整回答
反對 回復 2019-08-06
  • 3 回答
  • 0 關注
  • 565 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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