Re: [問題] 新手關於 #include 的問題

看板C_and_CPP (C/C++)作者 (火神)時間15年前 (2011/04/09 01:34), 編輯推噓2(2014)
留言16則, 2人參與, 最新討論串7/10 (看更多)
※ 引述《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

04/09 01:36, , 1F
推觀念 ... Qt 的引數 ref or ptr 的分類也是這樣分
04/09 01:36, 1F

04/09 01:40, , 2F
你說的是使用上, 而我說的是介面的參數傳遞, 參數的用
04/09 01:40, 2F

04/09 01:41, , 3F
法跟變數根本不一樣, 在 C++03 ref to const l-value
04/09 01:41, 3F

04/09 01:42, , 4F
也兼具了建構暫時物件的任務, 並不是單純以資料量的差
04/09 01:42, 4F

04/09 01:43, , 5F
別來區分
04/09 01:43, 5F

04/09 01:46, , 6F
傳址也用在傳遞buffer的情況, 如sprintf, 而不是因為
04/09 01:46, 6F

04/09 01:46, , 7F
這塊緩存在heap上
04/09 01:46, 7F

04/09 01:49, , 8F
ref to const l-value 不只提供 by value 語法, 你說
04/09 01:49, 8F

04/09 01:50, , 9F
的 std::string 更多情況是用來對 C-type string 作向
04/09 01:50, 9F

04/09 01:51, , 10F
下相容使然
04/09 01:51, 10F

04/09 01:52, , 11F
介面就是有一個不成文的規定, 內部你爽怎麼用都可以
04/09 01:52, 11F

04/09 01:56, , 12F
sprintf 是因為 C 沒有 reference 吧 ...
04/09 01:56, 12F

04/09 02:02, , 13F
有 reference, 你也不會用 ref to array/ ref to ptr
04/09 02:02, 13F

04/09 02:02, , 14F
來改寫
04/09 02:02, 14F

04/09 02:08, , 15F
嗯, 在C++我會用 vector, 的確不需要 array/ptr :P
04/09 02:08, 15F

04/09 02:12, , 16F
其實我想說的是有 decay 的問題 :)
04/09 02:12, 16F
文章代碼(AID): #1DdqSoSR (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DdqSoSR (C_and_CPP)