一,运算符重载简介
一个运算符本质上是一个函数,因此,运算符重载其实就是函数的重载。
运算符重载的目的就是为系统已有的运算符添加特殊的功能。
运算符重载在C++的特性中并不算很特别,这次把它单独拿出来作为一个章节是想借助运算符重载的一些样例来回顾一下C++的一些语法特性,代码量比较多,但是都很经典。
这次被重载的函数,全都是运算符函数,运算符函数的定义和普通函数的定义类似,主要区别在函数名称上,函数名称包含operator关键字和运算符。
运算符重载代码示例:
Box类的声明:
class Box
{
private:
double length {1.0};
double width {1.0};
double height {1.0};
double volume {1.0};
public:
//重载"<"运算符
bool operator<(const Box& aBox) const;
}
"operator<"重载的具体实现:
bool Box::operator<(const Box& aBox) const
{
return this->volume() < aBox.volume();
}
"operator<"重载的两种使用方式:
Box box1, box2;
//不带operator关键字
if (box1 < box2)
std::cout << "box1 is less than box2" << std::endl;
//带operator关键字
if(box1.operator<(box2))
std::cout << "box1 is less than box2" << std::endl;
运算符重载分两种情况:成员函数的运算符重载 & 非成员函数的运算符重载
成员函数的运算符重载:
函数为类的方法。
运算符表达式的左侧必须为该类的对象。
成员函数形式的二元运算符重载:
return_type operator X(data_type val);
非成员函数的运算符重载:
函数独立于类,是全局函数,通常为类的友元函数。
运算符表达式的左侧可以是不同类的对象。
非成员函数形式的二元运算符重载:
return_type operator X(data_type1 val_1, data_type2 val_2);
运算符重载包含以下限制:
1.不能添加新的运算符,只能重载语法中已定义过的运算符。
2.对象成员访问运算符("."),作用域解析运算符("::"),条件运算符("?:"),sizeof运算符等运算符不能被重载。
3.除了函数调用运算符、new和delete运算符以外,其他运算符的参数或操作数的数量在重载时不能被改变。举个例子,一元运算符,比如"++",重载时只能用于一个操作数。
4. 运算符重载不能更