C++学习 - 操作符重载

最近看< Inside The C++ object model >又开始复习一下操作符重载,顺便记下来。

操作符重载

正常情况下,我们的操作符都是有固定的意义的,例如:+ - * /操作符,正常情况下都是可以操作数字的运算,但是当我们需要对两个对象进行相加的时候,这个时候就需要重载操作符了,不然编译器不知道两个对象如何进行操作。

在C++中字符串是可以直接加法操作的,是因为在String类里已经重载了操作符。

重载操作符定义

首先操作符的重载正常情况都是定义类内部的函数,当然也可以定义为类的友元函数。

class Point{
public:
    Point();

    Point operator+(const Point &p);
private:
    int _a;
};

Point Point::operator+(const Point &p){
    Point tp(p);
    tp._a += this._a;
    return tp
}

声明了一个可用于将两个Point类相加的并获得一个Point的对象的副本。使用函数调用操作符可以接受任意数目的参数。

使用重载操作符

使用重载操作符的方式,与内置类型操作数上的操作符方式一样,假设p1和p2对象,可以输出他们的和,和int一样.

cout << p1 + p2 << endl;

这个会隐式调用为Point类的定义的operator+
也可以像调用普通函数一样调用重载操作符,并传递适当的类型适当数目的形参。

cout << operator+(p1, p2) << endl;

这个表达与上面一样。

重载操作符设计

设计类的时候,需要记住一些有用的经验原则,可以有助于确定应该提供那些重载操作符。

不要重载有内置含义的操作符

赋值操作符、取地址操作符和逗号操作符对类的类型操作数有默认的含义。如果没有特定的重载版本。编译器会自己定义一下操作符:

  • 合成赋值操作符进行逐个成员赋值。
  • 默认情况下,取地址操作符和逗号操作符
  • 内置逻辑与(&&)和逻辑或(||)操作符使用短路求值。

大多数操作符对类对象没有意义

除非提供了重载定义,赋值、取地址和逗号对类类型的操作数没有意义。

  • 相等测试操作应该使用operator==
  • 一般通过重载移位操作符进行输入输出
  • 测试对象是否为空的操作课用逻辑非操作符(operator!)来表示。

输入输出操作符

支持I/O操作的类所提供的I/O操作接口,一般应该与标准库iostream为内置类型定义的接口相同,隐刺,许多类需要重输入和输出操作符:

ostream&
operator<<( ostream &os, const Point &pt){
    os << "( ";
        os << pt.a;
    os << " )";
}

上面是输出操作符重载的简单定义。

输出操作符是:

friend ostream&
operator<<( ostream &os, const Point &pt){
    os <<"( ";
        os << pt.a;
    os <<" )";
}

输入操作符是:

friend istream&
operator>>( istream &os, const Point &pt){
    os >> pt.a;
}

至于算数操作符和关系操作符,定义使用基本差不多,还有一些错误检查,需要注意。

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值