C++运算符重载

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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值