作者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