[分享] c++ member function 和 non-member function
看板C_and_CPP (C/C++)作者angleevil (human)時間14年前 (2011/11/16 15:54)推噓8(8推 0噓 38→)留言46則, 6人參與討論串1/2 (看更多)
最近看書提到運算子何時該是member function或non-member function.
因此整理一下給大家參考,也希望大家指導錯誤的地方
1.member function 和 non-member function的差異
A.non-member function 都是定義在class外面,
也被稱為global function.
member function其實也有放在class的外面的機會,
通常會放在實作檔這邊,但是必須註明class的名稱.
反之non-member function不用在函式前面註明class的名字.
例如:
test.h
class myarray
{
int myfunction(int a, int b);
}
test.cpp
//member function
int myarray::myfunction(int a, int b)
{
...
}
//non-member function
int myfunction(int a, int b)
B.兩者在main函式呼叫的方法不同
例如:
int main()
{
int i;
myarray a; //declare a myarray object
i=myfunction(3,2); //non-member function
i=a.myfunction(3,2); //member function
}
2.理解兩者在運算子上的使用差異
以下面所舉二元運算子為例,
<lhs> <op> <rhs>
A.如果是member function來 overload,
左邊的 operand 一定是所屬的物件,
右邊的 operand 就是傳進來的參數,
編譯器實際上呼叫方式是lhs.operator<op>(rhs)
B.如果是non-member function來overload,
要註明左邊跟右邊的運算元類型.
它的寫法是T operator<op>(T1 lhs, T2 rhs),
T是傳回的類型,可以跟參數類型一樣.
編譯器實際上呼叫方式是operator<op>(lhs, rhs)
3.使用準則(用來決定運算子該是member function或non-member function)
A.一元運算子是members
B.= [] ()和->必須是members
C.assignment版的運算子(+=,-+等)必須是members
D.其他所有二元運算子都應該是nonmembers
參考資料
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原著;侯捷 譯
-台北市:普林帝斯霍爾,2000[民89]
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.220.204.217
推
11/16 16:13, , 1F
11/16 16:13, 1F
ex:
當operator +為member function時
Object obj;
double x;
double y;
x=obj+y;->x=obj.operator+(y)//這是ok
但是x=y+obj;->x=y.operator+(obj);//這是無法辦到的
上一行的結果是不自然的,
你不能要求使用者永遠只能用x=obj+y;去撰寫程式.
實際上作者也知道implict的問題,因此它用多載來解決.
至於shadow0326遲遲無法完全接這理由,
還有一個原因.我沒有拿<<和>>當例子.(><因為我無法理解書中的解釋,只能請其他人舉例)
ps:
拍謝,引用tropical72為例子
→
11/16 16:37, , 2F
11/16 16:37, 2F
推
11/16 16:51, , 3F
11/16 16:51, 3F
→
11/16 16:51, , 4F
11/16 16:51, 4F
→
11/16 16:51, , 5F
11/16 16:51, 5F
→
11/16 16:51, , 6F
11/16 16:51, 6F
→
11/16 16:51, , 7F
11/16 16:51, 7F
→
11/16 16:54, , 8F
11/16 16:54, 8F
→
11/16 17:10, , 9F
11/16 17:10, 9F
→
11/16 17:11, , 10F
11/16 17:11, 10F
推
11/16 17:19, , 11F
11/16 17:19, 11F
→
11/16 17:20, , 12F
11/16 17:20, 12F
→
11/16 17:20, , 13F
11/16 17:20, 13F
→
11/16 17:20, , 14F
11/16 17:20, 14F
→
11/16 17:22, , 15F
11/16 17:22, 15F
→
11/16 17:22, , 16F
11/16 17:22, 16F
→
11/16 17:23, , 17F
11/16 17:23, 17F
推
11/16 17:23, , 18F
11/16 17:23, 18F
→
11/16 17:23, , 19F
11/16 17:23, 19F
→
11/16 17:24, , 20F
11/16 17:24, 20F
→
11/16 17:26, , 21F
11/16 17:26, 21F
→
11/16 17:27, , 22F
11/16 17:27, 22F
→
11/16 17:28, , 23F
11/16 17:28, 23F
→
11/16 17:30, , 24F
11/16 17:30, 24F
→
11/16 17:30, , 25F
11/16 17:30, 25F
→
11/16 17:34, , 26F
11/16 17:34, 26F
→
11/16 17:36, , 27F
11/16 17:36, 27F
推
11/16 17:39, , 28F
11/16 17:39, 28F
→
11/16 17:42, , 29F
11/16 17:42, 29F
→
11/16 17:42, , 30F
11/16 17:42, 30F
→
11/16 17:43, , 31F
11/16 17:43, 31F
→
11/16 17:44, , 32F
11/16 17:44, 32F
→
11/16 17:44, , 33F
11/16 17:44, 33F
→
11/16 17:45, , 34F
11/16 17:45, 34F
→
11/16 17:45, , 35F
11/16 17:45, 35F
→
11/16 17:45, , 36F
11/16 17:45, 36F
→
11/16 17:48, , 37F
11/16 17:48, 37F
→
11/16 19:28, , 38F
11/16 19:28, 38F
※ 編輯: angleevil 來自: 61.220.204.217 (11/17 08:25)
※ 編輯: angleevil 來自: 61.220.204.217 (11/17 11:35)
推
11/18 04:47, , 39F
11/18 04:47, 39F
→
11/18 04:48, , 40F
11/18 04:48, 40F
推
11/18 04:52, , 41F
11/18 04:52, 41F
→
11/18 07:14, , 42F
11/18 07:14, 42F
→
11/18 07:15, , 43F
11/18 07:15, 43F
→
11/18 07:19, , 44F
11/18 07:19, 44F
→
11/18 07:19, , 45F
11/18 07:19, 45F
推
11/18 10:18, , 46F
11/18 10:18, 46F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章