Re: [分享] c++ member function 和 non-member function
※ 引述《angleevil (human)》之銘言:
恕刪。
: 參考資料
: 1.http://www.cs.uregina.ca/Links/class-info/210/Overloading/membervsregular.html
: 2.http://www.programmer-club.com.tw/ShowSameTitleN/c/31905.html
: 3.Exceptional C++ 國際中文版: 47個工程難題`編程疑問`及其解決方法/Herb Sutter原著;侯捷 譯
我也是初學者,一起探討一下。
焦點放在下面這問題,我持有一點點不同見解。
class overload operator 時,該以 member function 實作,
或以 global overload operaotr 方式實作?
上篇例子曾以此例做引述,並以加法為例。
double x, y;
Object obj;
簡化一點問題,不考慮 pointer、template,
想法如下。
<case 1> x = obj + y; (pod = class + pod)
x = obj.operator+(y);
必須提供 member function
double Object::operator+(const Object& rhs) const;
<case 2> x = y + obj; (pod = pod + class)
x = y.operator+(obj); // double = double.operator(object) ??
必須提供 global overload
double operator+(double, const Object& rhs);
上面 case 1, case 2 本身並不衝突,可以只提供 case1 ,
但這樣做真的很怪!目前看過的公用 class ,有哪個是只提供 1 不提供 2 的嗎?
拿 string class 為例。
const char* c_style = "c style";
string cpp_style="cpp style", rst;
這種 class 總不能只限定 rst = cpp_style + c_style 吧 ?
而 case 1 的確也可用 global overload operator 方式完成,
但 case 2 就一定只能用 global overload operator 方式完成。
( 除非 case 2 裡面的 double 又是另一 class type, 另當別論)
但總而言之是,只 overload 一種真的是件奇怪的事,
重點是有些情況下,就一定要兩種都要提供,
特別是像這種情況出現的時候
double x, y, z;
object o1, o2, o3;
z = x + o1 + y + o2 + o3;
還是要改成這樣 ?
z = o1 + o2 + o3 + x + y
這麼寫還是會出包唷
(1) 先看 o1+o2
double tmp = o1+o2;
tmp = o1.operator+(o2);
(2) 再看 o1 + o2 + o3
double tmp2 = o1 + o2 + o3 = tmp + o3;
tmp2 = tmp.operator+(o3); /* double = double.operator(object) */
還是硬要叫別人把這一行,在呼叫的時候寫成這樣?
double t1= x + y;
double t2= o3 + t1;
double t3= o2 + t2;
double z = o1 + t3;
如果這樣可接受的話,那就只做 case 1 吧,
(我只能為 co-worker 的 partner 默哀)
遇到這種情況的話,最終還是兩種都要 overload 。
而且上面用到的還是 double (POD),如果今天遇到的是 class A + class B
又更麻煩, 這也不是用 member function 就適合解決的事,
故可能還是該 case by case 方式下去探討較為合適。
此篇只作拋磚引玉之效,期待更多高人予以指教。
--
No matter how gifted you are,
alone, can not change the world.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.78.41
※ 編輯: tropical72 來自: 180.177.78.41 (11/16 20:42)
→
11/16 20:48, , 1F
11/16 20:48, 1F
→
11/16 20:49, , 2F
11/16 20:49, 2F
→
11/16 20:50, , 3F
11/16 20:50, 3F
→
11/16 20:52, , 4F
11/16 20:52, 4F
→
11/16 20:53, , 5F
11/16 20:53, 5F
→
11/16 20:53, , 6F
11/16 20:53, 6F
→
11/16 20:54, , 7F
11/16 20:54, 7F
→
11/16 22:13, , 8F
11/16 22:13, 8F
→
11/17 01:14, , 9F
11/17 01:14, 9F
→
11/17 08:20, , 10F
11/17 08:20, 10F
→
11/17 08:21, , 11F
11/17 08:21, 11F
討論串 (同標題文章)