您的位置:首页 > 编程语言 > C语言/C++

C++运算符重载

2016-06-12 17:49 309 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 运算符 重载