看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《loveme00835 (朴髮箍)》之銘言: : // b.cpp : #include "b.h" : struct Pimpl : { : A a; : C c; : D *d; : // 更多成員 ... : }; : // 其他實作碼 : void B::do_something() : { : objs->c.method(); : objs->d->method(); : } : 實作碼這時候就會變得複雜, 但是所減少的編譯成本還比你的方法 : 來得多 喔,這個東西不錯!可以視情況加入函式庫裡, 有這麼好用的東西不用也太可惜 : 沒有筆誤, 假如你開發的類別長這樣: : 然後在使用上: : 然後我跟你說, 其實 DoSomething 只是將 a 當錯 in parameter, : DoOtherThing 將 a 當做 out parameter, 而這些在方法名稱上都 : 看不出來, 下面的程式碼較為符合從C語言繼承下來的呼叫習慣 下面一起回 : : 一般的情況下連 string 這種小東西都有人建議多使用 const string &s 取值了 : 這就像我說的 : pointer to non-const & reference to const : 遠比 : pointer to const & reference to non-const : 來得好, 不只有你開發端的地方要注意, 客戶的使用也要考慮進來 : , 強迫客戶用 by reference 語法來傳遞引數, 以達成 by value : 語意是相當不自然的. : 但是你就算選擇了第一個方案, 還會面臨到介面在呼叫起來不方便 : 的問題, 引數一下要加 &一下又不用加. : 你改到通通都不加也不是一件好事, 因為這樣就無法一眼就看出函 : 式的行為是何種, 還記得7 +- 2 法則嗎?你讓讀者背的東西愈多, : 程式碼的品質也愈差. 我不確定你有沒有仔細看完我說的內容,幸好我下面的文你並未刪除 : : 而通常我們都能夠分辨哪些東西是夠小,夠常被存取的東西 : : 哪些東西是很大,我們不常重複的存取整份資料的東西 : : (Managed C++ 把它們分為 value class/ ref class) : : (或者你也可以用 struct 與 class 區分它們) : : 而就我的經驗,使用 pointer 的機會應該遠比直接存取變數情況要多得多 : : 當然,那些情況使用 pointer 的效率比較好,程式碼也比較單純 : : 尤其是在使用 vector 將你的 class 裝起來的時候 實際上 pointer to non-const & reference to const 與 pointer to const & reference to non-const 並不是互斥的東西,它們根本不該拿來這樣比較,連分組都錯了 我的意思是,使用 pointer 或者 reference 並不取決於你是否當它是 in or out 一個 reference 與 pointer 使用上有什麼差別? 當 a 是 reference,b 是 pointer a= 5; // 合理,常出現 c= *b; // 合理,常出現 delete b; // 合理,常出現 delete &a; // ??? 使用 pointer 或者 reference,在習慣上意味著 (真要說 C 的習慣的話) 它們所代表的原始資料是在 heap 上或者 stack 上 甚至更極端的,通常只有 string 會使用 reference 表示 (好吧,也許還有 vector 等基礎容器) 也就是說,基本上我們會傾向 不選擇 pointer to non-const & reference to const 也不選擇 pointer to const & reference to non-const 而是選擇 pointer to custom class & reference to stl container with value to custom struct 而使用上,有 const 不用來表達語意 還要浪費 reference 這個新功能來代表 const 實在是很奇怪 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 175.180.111.210
legnaleurc:推觀念 ... Qt 的引數 ref or ptr 的分類也是這樣分 04/09 01:36
loveme00835:你說的是使用上, 而我說的是介面的參數傳遞, 參數的用 04/09 01:40
loveme00835:法跟變數根本不一樣, 在 C++03 ref to const l-value 04/09 01:41
loveme00835:也兼具了建構暫時物件的任務, 並不是單純以資料量的差 04/09 01:42
loveme00835:別來區分 04/09 01:43
loveme00835:傳址也用在傳遞buffer的情況, 如sprintf, 而不是因為 04/09 01:46
loveme00835:這塊緩存在heap上 04/09 01:46
loveme00835:ref to const l-value 不只提供 by value 語法, 你說 04/09 01:49
loveme00835:的 std::string 更多情況是用來對 C-type string 作向 04/09 01:50
loveme00835:下相容使然 04/09 01:51
loveme00835:介面就是有一個不成文的規定, 內部你爽怎麼用都可以 04/09 01:52
legnaleurc:sprintf 是因為 C 沒有 reference 吧 ... 04/09 01:56
loveme00835:有 reference, 你也不會用 ref to array/ ref to ptr 04/09 02:02
loveme00835:來改寫 04/09 02:02
legnaleurc:嗯, 在C++我會用 vector, 的確不需要 array/ptr :P 04/09 02:08
loveme00835:其實我想說的是有 decay 的問題 :) 04/09 02:12