C++ 允许我们重定义操作符用于类类型对象时的含义。如果需要,可以像内置转换那样使用类类型转换,将一个类型的对象隐式转换到另一类型。明智地使用操作符重载可以使类类型的使用像内置类型一样直观。
大多数重载操作符可以定义为普通非成员函数或类的成员函数。
作为类成员的重载函数,其形参看起来比操作数数目少 1。作为成员函数的操作符有一个隐含的 this 形参,限定为第一个操作数。
cout << item1 + item2 << endl;
这个表达式隐式调用为 Sales_items 类定义的 operator+。也可以像调用普通函数一样调用重载操作符函数,指定函数并传递适当类型适当数目的形参:
// equivalent direct call to nonmember operator function
cout << operator+(item1, item2) << endl;
这个调用与 item1 和 item2 相加的表达式等效。
item1 += item2; // expression based "call"
item1.operator+=(item2); // equivalent call to member operator function
两个语句都将 item2 的值加至 item1。第一种情况下,使用表达式语法隐式调用重载操作符函数:第二种情况下,在 item1 对象上调用成员操作符函数。
重载操作符的设计
(1)不要重载具有内置含义的操作符
赋值操作符、取地址操作符和逗号操作符对类类型操作数有默认含义。如果没有特定重载版本,编译器就自己定义以下这些操作符。
(2)赋值必须返回对 *this 的引用
// assumes that both objects refer to the same isbn
Sales_item& Sales_item::operator+=(const Sales_item& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
(3)下标操作符
可以从容器中检索单个元素的容器类一般会定义下标操作符,即operator[]。标准库的类 string 和 vector 均是定义了下标操作符的类的例子。
下标操作符必须定义为类成员函数。
下面的类定义了下标操作符。为简单起见,假定 Foo 所保存的数据存储在
一个 vector<int>: 中:
class Foo {
public:
int &operator[] (const size_t);
const int &operator[] (const size_t) const;
// other interface members
private:
vector<int> data;
// other member data and private utility functions
};
下标操作符本身可能看起来像这样:
int& Foo::operator[] (const size_t index)
{
return data[index]; // no range checking on index
}
const int& Foo::operator[] (const size_t index) const
{
return data[index]; // no range checking on index
}
网友评论