C++能够重载绝大部分运算符,其中有4个运算符不能被重载,如下表所示:
. | 成员选择符 |
.* | 成员对象选择符 |
:: | 域解析操作符 |
?: | 条件操作符 |
Sizeof() | 长度运算符 |
只能重载为成员函数的运算符,如下表所示:
= | 赋值运算符 |
[] | 下标运算符 |
() | 函数运算符 |
-> | 间接成员访问 |
->* | 间接取值访问 |
下面是运算符建议重载:
运算符 | 建议 |
所有一元运算符 | 成员 |
= [] () -> ->* | 必须是成员 |
+ = -= 、= *= ^= &= != %= > >= < <= | 成员 |
其他二元操作符 | 非成员 |
下面写出重载"+"运算符的示例:
#include <iostream>class OverLoad{public:
OverLoad(int x1 = 0, int x2 = 0);const OverLoad operator +(const OverLoad &other)const;void print()const;friend const OverLoad operator+(const OverLoad &object1, const OverLoad &object2);private:
int operator1;int operator2;};OverLoad::OverLoad(int x1, int x2):operator1(x1),operator2(x2){}const OverLoad OverLoad::operator +(const OverLoad &other)const{OverLoad temp;temp.operator1 = this->operator1 + other.operator1;temp.operator2 = this->operator2 + other.operator2;std::cout<<"operator+(const OverLoad &other)"<<std::endl;return temp;}void OverLoad::print()const{std::cout<<"operator1:"<<this->operator1<<", operator2:"<<this->operator2<<std::endl;}const OverLoad operator +(const OverLoad &object1, const OverLoad &object2){OverLoad temp;temp.operator1 = object1.operator1 + object2.operator1;temp.operator2 = object1.operator2 + object2.operator2;std::cout<<"operator +(const OverLoad &object1, const OverLoad &object2)"<<std::endl;return temp;}int main(){OverLoad object1(10, 15), object2(13, 16);OverLoad object3 = object1 + object2;object3.print();
}
上面提供两种方式重载"+"运算符,一种是类的成员函数,另一种是类的友元函数实现,两种实现均能实现重载"+"运算符,区别是他们的作用域不相同。下面是输出结果:
operator +(const OverLoad &object1, const OverLoad &object2)
operator1:23, operator2:31
可以看出上面调用的是友元函数重载的"+"运算符,OverLoadobject3=object1+object2;//相当于OverLoad object3 = operator +(object1, object2);
上面示例是两个对象的类型相同,下面将介绍运算符重载二元操作的操作数的类型不相同。
#include <iostream>
using std::string;
class Mail;
class Sender
{
public:
Sender(string address);
Sender &operator <<( Mail &mail);
private:
string m_address;
};
Sender::Sender(string address)
:m_address(address)
{
}
class Mail
{
public:
Mail(string title, string content, string time);
friend Sender &Sender::operator <<( Mail &mail);
private:
string m_title;
string m_content;
string m_time;
};
Mail::Mail(string title, string content, string time)
:m_title(title),
m_content(content),
m_time(time)
{
}
Sender & Sender::operator <<( Mail &mail)
{
std::cout<<m_address<<std::endl;
std::cout<<mail.m_title<<std::endl;
std::cout<<mail.m_content<<std::endl;
std::cout<<mail.m_time<<std::endl;
return *this;
}
输出如下:int main(){Sender sender("zhang1994J@163.com");Mail mail1("吃饭","中午去吃饭","2016-06-13 11-00"), mail2("午休", "中午午休", "2016-06-13 12-45");sender<<mail1<<mail2;
}
zhang1994J@163.com
吃饭
中午去吃饭
2016-06-13 11-00
zhang1994J@163.com
午休
中午午休
2016-06-13 12-45