C_and_CPP 板


LINE

※ 引述《d630200x (DOGE)》之銘言: : 有看到有人說這樣效率比較好 : 但我自己測試來看是看不出差異(可能是我測試方式太簡單) : 就我個人來說我是覺得寫在函式裡較為美觀 : 但是很多網路上的無論是simple code還是教學,在初始化時是比較常看到單冒號的 : 請問是真的效率上差很多,還是單純風格差異而已? : ----- : Sent from JPTT on my Asus ASUS_I01WD. 這在語法還有語意上有不同的考量, 後面會舉兩個例子說明. 語法 通常初學者會有這個問題是因為使用到 SemiRegular 型別物件作為資料成員 , 如 int, double 等等 vocabulary type, 它們都有功能相仿的建構子 (constructor)operator=() 可呼叫. 不妨寫個類別實驗看看兩種寫法有 什麼差異: #include <cstdio> struct MyInt { MyInt() { puts(__PRETTY_FUNCTION__); } MyInt(int) { puts(__PRETTY_FUNCTION__); } MyInt& operator=(int) { puts(__PRETTY_FUNCTION__); return *this; } }; struct Test { Test() { i = 0; } Test(bool) : i(0) {} MyInt i; }; Test(); // print: MyInt::MyInt() // MyInt& MyInt::operator=(int) Test(true); // print: MyInt::MyInt(int) 建構子是絕對會被呼叫的函式, 因此物件的狀態若能在建構子裡面準備好, 就 不需要額外呼叫別的函式做重複的事情. 語意 資料成員/父類別也算是物件的一部分, 在它們的建構子都成功結束的前提下 , 我們才有辦法建構出完整的物件. 所以語言設計上你無法消除從資料成員/ 父類別建構子丟出的例外: #include <iostream> #include <stdexcept> struct Foo { Foo() { throw std::runtime_error("message"); } }; struct Bar { Bar() try { // constructor body } catch (std::exception& e) { std::cerr << e.what() << std::endl; // exception will be re-thrown here } Foo foo; }; 對 std::vector 這類會在獲取記憶體失敗時丟出例外的資料成員, 我們可以 用 two-phase initialization 來延後準備物件狀態, 讓物件有機會完成初始 (雖然通常呼叫建構子比較合理): #include <vector> struct Example { Example() { do { try { v.resize(10'000'000); } catch (std::bad_alloc& e) { // do something here } } while (empty(v)); // retry until success } std::vector<int> v; }; 所以風格怎樣的倒不是重點, 重要的是你要知道自己在做什麼 :) -- [P1389R1] Standing Document for SG20: Guidelines for Teaching C++ to Beginners https://wg21.link/p1389r1 SG20 Education and Recommended Videos for Teaching C++ https://www.cjdb.com.au/sg20-and-videos --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.76.216 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1606252263.A.77F.html
1F:推 petercoin: 推一個 11/25 11:31
※ 編輯: poyenc (123.193.76.216 臺灣), 11/25/2020 11:38:46
2F:推 s4300026: 推 11/25 17:41
3F:推 KevinR: m 11/25 19:07
4F:推 F04E: 推 11/26 10:17
5F:推 deangood01: 有開優化 compiler應該還是會幫忙做 09/14 17:36







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP