分享
 
 
 

C++操作符重载与临时非堆变量的一次测试

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

今天仔细看了一下以前当参考书翻的《Effective C++》和《More Effective C++》,着重看了里面讲述关于操作符重载的种种实做方法,看着很爽,就自己实际操作了一遍。编译器使用VC++.NET 7.1,因为这个编译器对C++标准的支持达到99%。现在把测试代码和输出贴出来,供同志们交流之用。

//CInt.h///////////////////////////////////

#include <iostream>

using namespace std;

class CInt

{

public:

CInt();

CInt(int i);

CInt(CInt& cint);

CInt(CInt* pcint);

CInt& operator =(const CInt& i);

CInt& operator =(int i);

void operator <<(char *str);

friend CInt operator +(const CInt& lhv, const CInt& rhv);

~CInt();

private:

int m_i;

};

//CInt.cpp///////////////////////////////////

#include "CInt.h"

CInt::CInt() :m_i(0)

{

cout<<"\n CInt::CInt() this="<<this;

}

CInt::CInt(int i) :m_i(i)

{

cout<<"\n CInt::CInt(int i) m_i="<<m_i<<" this="<<this;

}

CInt::CInt(CInt &cint) :m_i(cint.m_i)

{

cout<<"\n CInt::CInt(CInt &cint) m_i="<<m_i<<" cint.m_i="<<cint.m_i<<" this="<<this<<" &cint="<<&cint;

}

CInt::CInt(CInt *pcint) :m_i(pcint->m_i)

{

cout<<"\n CInt::CInt(CInt *pcint) m_i="<<m_i<<" pcint->m_i="<<pcint->m_i<<" this="<<this<<" pcint="<<pcint;

}

CInt& CInt::operator =(const CInt &i)

{

cout<<"\n CInt::operator =(CInt &i) this="<<this<<" &i="<<&i;

m_i = i.m_i;

return (*this);

}

CInt& CInt::operator =(int i)

{

cout<<"\n CInt::operator =(int i) this=his="<<this<<" i="<<i;

m_i = i;

return (*this);

}

void CInt::operator <<(char *str)

{

cout<<"\n CInt::operator <<(char *str) this="<<this<<" m_i="<<m_i<<" "<<str;

}

CInt operator +(const CInt& lhv, const CInt& rhv)

{

cout<<"\n operator +(CInt& lhv, CInt& rhv) lhv="<<&lhv<<" rhv="<<&rhv;

return CInt(lhv.m_i+rhv.m_i);

}

CInt::~CInt()

{

cout<<"\n CInt::~CInt() this="<<this;

}

//main.cpp///////////////////////////////////

#include "CInt.h"

void Fun0(CInt i)

{

cout<<"\n Fun0(CInt i) &i="<<&i;

}

void Fun1(CInt &i)

{

cout<<"\n Fun1(CInt &i) &i="<<&i;

}

void Fun2(const CInt &i)

{

cout<<"\n Fun2(const CInt&i) &i="<<&i;

}

void main()

{

cout<<"CInt i(2), temp(10);";

CInt i(2), temp(10);

cout<<"\nCInt j(i);";

CInt j(i);

cout<<"\nCInt k(&i);";

CInt k(&i);

cout<<"\nFun0(i);";

Fun0(i);

cout<<"\nFun1(i);";

Fun1(i);

cout<<"\nFun2(2);";

Fun2(2);

cout<<"\ni = temp;";

i = temp;

cout<<"\ni = 20;";

i = 20;

cout<<"\ni<<\"mck\";";

i<<"mck";

cout<<"\ni = j+k;";

i = j+k;

cout<<"\ni = j+6;";

i = j+6;

cout<<"\ni = 5+j;";

i = 5+j;

cin.get();

}

/////////以下是输出/////////////////////////

CInt i(2), temp(10);

CInt::CInt(int i) m_i=2 this=0012FEC4

CInt::CInt(int i) m_i=10 this=0012FED4

CInt j(i);

CInt::CInt(CInt &cint) m_i=2 cint.m_i=2 this=0012FEC8 &cint=0012FEC4

CInt k(&i);

CInt::CInt(CInt *pcint) m_i=2 pcint->m_i=2 this=0012FED0 pcint=0012FEC4

Fun0(i);

CInt::CInt(CInt &cint) m_i=2 cint.m_i=2 this=0012FEBC &cint=0012FEC4

Fun0(CInt i) &i=0012FEBC

CInt::~CInt() this=0012FEBC

Fun1(i);

Fun1(CInt &i) &i=0012FEC4

Fun2(2);

CInt::CInt(int i) m_i=2 this=0012FECC

Fun2(const CInt&i) &i=0012FECC

CInt::~CInt() this=0012FECC

i = temp;

CInt::operator =(CInt &i) this=0012FEC4 &i=0012FED4

i = 20;

CInt::operator =(int i) this=his=0012FEC4 i=20

i<<"mck";

CInt::operator <<(char *str) this=0012FEC4 m_i=20 mck

i = j+k;

operator +(CInt& lhv, CInt& rhv) lhv=0012FEC8 rhv=0012FED0

CInt::CInt(int i) m_i=4 this=0012FECC

CInt::operator =(CInt &i) this=0012FEC4 &i=0012FECC

CInt::~CInt() this=0012FECC

i = j+6;

CInt::CInt(int i) m_i=6 this=0012FECC

operator +(CInt& lhv, CInt& rhv) lhv=0012FEC8 rhv=0012FECC

CInt::CInt(int i) m_i=8 this=0012FED8

CInt::operator =(CInt &i) this=0012FEC4 &i=0012FED8

CInt::~CInt() this=0012FED8

CInt::~CInt() this=0012FECC

i = 5+j;

CInt::CInt(int i) m_i=5 this=0012FECC

operator +(CInt& lhv, CInt& rhv) lhv=0012FECC rhv=0012FEC8

CInt::CInt(int i) m_i=7 this=0012FED8

CInt::operator =(CInt &i) this=0012FEC4 &i=0012FED8

CInt::~CInt() this=0012FED8

/////////测试总结/////////////////////////

首先是各操作符的参数类型均设置成了const常类型,这一点在More Effective C++一书条款19中有明确的说明,这样做是为了使操作符能接受隐式的类型转换参数。测试语句是main()中的Fun2(2)调用,输出为:

CInt::CInt(int i) m_i=2 this=0012FECC//隐式类型转换,由int 2构造临时对象

Fun2(const CInt&i) &i=0012FECC//临时对象的引用传递给Fun2

CInt::~CInt() this=0012FECC//Fun2结束,析构临时对象

根据这一点,在参数表中写上const将是一种是函数适用性提高的手段。

其次是operator + 的使用,这一点在Effctive C++条款19中有说明。若将该操作符声明为类的成员,则(CInt)i+(int)2的调用是正确的,而(int)2+(CInt)i的调用是错误的,这一点不满足内置类型int满足的交换率。因此操作符被声明为友元。测试语句是main()中的最后两句 i=j+6;i=5+j;输出为:

i = j+6;

CInt::CInt(int i) m_i=6 this=0012FECC//隐式类型转换,由int 6构造临时对象

operator +(CInt& lhv, CInt& rhv) lhv=0012FEC8 rhv=0012FECC//执行操作符制定的操作

CInt::CInt(int i) m_i=8 this=0012FED8//为了返回结果而构造另外一个局部无名对象

CInt::operator =(CInt &i) this=0012FEC4 &i=0012FED8//返回结果复制给i,所以调用“=”操作符

CInt::~CInt() this=0012FED8//释放局部无名对象

CInt::~CInt() this=0012FECC//操作符调用结束,释放临时对象

i = 5+j;//同上

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有