作者Ebergies (火神)
看板C_and_CPP
標題Re: [問題] 新手關於 #include 的問題
時間Sat Apr 9 01:34:39 2011
※ 引述《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