1) 非成员函数的调用 operator+为对象data1, data2的非成员函数
data1 + data2; ==> operator+(data1 , data2);
2) 成员函数的调用 operator+为对象data1的成员函数
data1 + data2 ==> data1.operator+(data2);
重载的运算符本质上就是函数调用.
1) 运算符的求值顺序无法保留 如: && , || , & , | 等
2) 无法保留运算符的短路求值属性
1) 含对象的混合类型表达式,则运算符必须定义成非成员.2) 当定义为成员函数时, 左侧运算对象必须是运算符所属类的一个对象.
输入输出运算符必须是非成员函数,一般为友元.
ostream & operator<<(ostream &os, const Object &item ){
os<< item.data1<< " "<< item.data2;
return os;
}
istream & operator>>(isteam &is, Object &item){
double p;
is >> item.data1>>item.data2>>p;
if(is){
item.data2 = item.data2 * p;
}else{
item = Object();//输入失败:对象被赋予默认状态
}
return is;
}
拷贝赋值, 移动赋值,列表赋值,复合赋值
赋值运算符必须为类成员,复合赋值通常也为成员.这两类都返回左侧对象的引用.
<span style="font-size:14px;">class StrPtr {
public:
std::string& operator*() const {
auto p = check(curr, "dereference past end");
return (*p)[curr];
}
std::string* operator->() const{
return &this->operator*();
}
//其他内容
}</span>
如果我们对同一个类即提供转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题.
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/tangchenchan/article/details/46727641