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

C++学习 - 操作符重载

2016-01-03 23:56 363 查看
最近看< 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;
}


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

以上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 操作符重载