C++的运算符重载:使对象的运算表现得和编译器内置类型一样
如下代码,如果T是整形,那很好理解,但是如果 T 是一个 Student 类, a + b ?怎么操作,两个学生类怎么相加?
这个就是我们要说的运算符重载问题
template
T sum(T a,T b){
return a + b; // a.+(b) => a.operator+(b) operator+ 就是我们需要的函数
}
CComplex operator+(const CComplex &lhs, const CComplex &rhs){
reutrn CComlex(lhs.x+rhs.x,lhs.y+rhs.y);
// 由于不能再类外访问CComplex的私有成员,所以我们可以加上友元
// 在CComplex 加上 firend CComplex operator+(const CComplex &lhs, const CComplex &rhs);
}
ostream & operator<<(ostream & cout, const CComplex & val){
cout<<"Complex = "<<val.x <<" "<<val.y<<endl;
return out
}
class CComplex{
public:
CComplex(int _x=1,int _y=1):x(_x),y(_y){}
Complex operator+(const CComplex & _com){
CComplex _comp;
_comp.x= this->x + _com.x
_comp.y= this->y +_com.y;
return _comp;
}
//后置++,返回的是 + 之前的值
Complex operator++(int){
CComplex tep=*this;
x++;
y++;
return tep;
}
//前置++ 返回加后的值
Complex & operator++(){
x++;
y++;
return *this;
}
//+=不需要返回值
void operator+=(const CComplex & _value){
x=x+_value.x;
y=y+_value.y;
}
private:
int x;
int y;
firend CComplex operator+(const CComplex &lhs, const CComplex &rhs);
firend ostream & operator<<(ostream & cout, const CComplex & val) ;
}
int main(){
CComplex comp1(100,200);
CComplex comp2(1,2);
CComplex comp3=comp1 + comp2;
CComplex comp4=comp1 + 20;//comp1.operator+(CComplex tep) => comp1.operator+(将20转为CComplex对象)
//这个时候编译器会想办法 把 20转为CComplex对象,在上面的类中,可以转,因为 CComplex(int _x=1,int _y=1) 有默认值
//所以上面代码 会使用20创建一个CComplex 对象,然后 再让他们相加
CComplex comp5=30 +comp1;//编译报错 30.operator+(CComplex tep) 整形数的加法运算符里面没有operator+(CComplex tep) 编译器不会把30转为CComplex对象
//编译器在做对象的运算的时候,会调用对象的运算符重载函数(优先调用成员方法),r如果没有成员方法
//就会在全局作用域中找合适的运算符重载函数 所以 CComplex comp5=30 +comp1 编译器
//当在整数中找不到成员方法是,还可以 ::operator+(30,comp1) 在全局作用域中找运算符重载函数
//就会调用全局作用域中的 CComplex operator+(const CComplex &lhs, const CComplex &rhs) 方法,
//所以如果希望CComplex comp5=30 +comp1;编译通过,可以加上全局函数 CComplex operator+(const CComplex &lhs, const CComplex &rhs)
return 0;
}
原文地址:http://www.cnblogs.com/erichome/p/16909682.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性