作者ric2k1 (Ric)
看板EE_DSnP
標題Re: [問題] overloading *
時間Wed Dec 8 10:54:45 2010
寫個小程式,大家可以參考看看:
=========== 程式開始 ===========
#include <iostream>
using namespace std;
class A
{
public:
A(int d = 0):_data(d) {}
const int& operator *() const { cout << "const *" << endl; return _data; }
int& operator *() { cout << "non-const *" << endl; return _data; }
private:
int _data;
};
class B
{
public:
void f() const { cout << *_a << endl; }
private:
A _a;
};
int main()
{
A a1(10);
const A a2(20);
cout << "> Non-const A" << endl;
cout << *a1 << endl;
cout << "> Const A" << endl;
cout << *a2 << endl;
cout << "> RHS access for non-const A" << endl;
int i = *a1;
cout << i << endl;
cout << "> RHS access for Const A" << endl;
int j = *a2;
cout << j << endl;
cout << "> LHS assignment for non-const A" << endl;
*a1 = 100;
cout << *a1 << endl;
// a2 is const; cannot be LHS
// *a2 = 200;
cout << "> Calling through const member function" << endl;
B b;
b.f();
}
============ 執行的結果 ==============
> Non-const A
non-const *
10
> Const A
const *
20
> RHS access for non-const A
non-const *
10
> RHS access for Const A
const *
20
> LHS assignment for non-const A
non-const *
non-const *
100
> Calling through const member function
const *
0
=========== 評論 ==============
non-const object 就會去呼叫 non-const version,
const object 就會去呼叫 const-version.
你可以試試看把:
const int& operator *() const { cout << "const *" << endl; return _data; }
int& operator *() { cout << "non-const *" << endl; return _data; }
其中一個 comment out 掉,
看看 compile 之後的 error message 為何,
你就知道為什麼兩個都要寫了!
※ 引述《aldreamp (小孟)》之銘言:
: ※ 引述《CocoGrisp (快腿正姊摳摳李玟)》之銘言:
: : 想請問老師要我們 overload *
: : 給了兩個形式
: (A.) 其中一個是 const method const T& operator * () const {}
: (B.) 另外一個是 T& operator * () {}
: : 為什麼要兩種呢 ?
: : 想不太出來會有哪兩種不一樣的情況呼叫到 "*"
: : 如果只是 dereference 的話
: : 應該都不會改到原本 iterator 的資料吧
: : 煩請老師或同學們指點了
: : 謝謝
: : 推 GriffeyKao:看起來一個是在左邊呼叫 另一個在右邊呼叫 05/13 16:13
: → GriffeyKao:例如 int* p; int a = *p; *p = 10; 這樣不知對不對? 05/13 16:14
: : 推 bnsblue:茪W說得沒錯 05/13 17:26
: : → bnsblue:樓上↑XD怎麼會出現亂碼 05/13 17:27
: 推 danielko:記得老師說const的version比較快? 05/13 17:30
: → danielko:所以compiler在可以選的時候會先用 05/13 17:31
: : → CocoGrisp:thx ! 05/13 17:36
: 看不太懂前人的討論文 想請問大家這篇討論文是這樣的意思嗎?
: (CALL 1.)int a = *p;
: 會去呼叫 const method const T& operator * () const {}
: (CALL 2.)*p = 10;
: 會去呼叫T& operator * () {}
: 而原因是const定義的method(A.)比較快,所以compiler在呼叫時會優先選有const的(A.)?
: 所以執行(CALL 1.)時用有const的(A.),而執行(CALL 2.)因為內容會被改變,所以用(B.)
: 沒有const的
: 那 請問(CALL 1.) 跟 (CALL 2.) 是不是都回傳同樣的資料
: 只是分別是 讀與寫 的差別而已?
: 請問我這樣解釋對嗎??
: 謝謝大家QQ
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.36.52.227
1F:推 aldreamp:喔喔 好的 謝謝老師 我試試看!! 12/08 23:48