(1)操作符重载意义
对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,
对于用户自己定义的class,如果想要支持基本操作,比如比较大小,判断是否相等,等等。
则需要用户自己来定义关于这个操作符的具体实现。
(2)重载操作符的定义格式
定义一个重载操作符和定义一个函数,不过函数的名字的关键字operator
后面接要定义的操作符号,定义格式:
返回类型 operator操作符(参数列表)
(3)可重载的操作符
在C++中几乎所有的操作符都可以重载,不过也是有几个是不可以重载的。
四个不可以重载的操作符
成员访问运算符. 作用域运算符:: 长度运算符sizeof 条件运算符 ?:
(4)运算符重载的原则
1.C++中只能对已有的C++运算符进行重载,不允许用户自己定义新的运算符。
2.运算符重载后不能改变运算符的操作对象(操作数)的个数。如:"+"是实现两个操作数的运算符,重载后仍然为双目运算符。
3.重载不能改变运算符原有的优先级和原有的结合性。
4.运算符重载不能全部是C++中预定义的基本数据,这样做的目的是为了防止用户修改用于基本类型数据的运算符性质。
(5)两种实现方式
class 类名
{
friend 返回类型 operator 操作符(形参表);
};
//类外定义格式:
返回类型 operator操作符(参数表)
{
//函数体
}
{
friend 返回类型 operator 操作符(形参表);
};
//类外定义格式:
返回类型 operator操作符(参数表)
{
//函数体
}
class 类名
{
public:
返回类型 operator 操作符(形参表);
};
//类外定义格式
返回类型 类名::operator 操作符(形参表)
{
//函数体
}
{
public:
返回类型 operator 操作符(形参表);
};
//类外定义格式
返回类型 类名::operator 操作符(形参表)
{
//函数体
}
类成员实现操作符重载需要的形式参数比原来少一个,这比如:利用类成员函数实现一元操作符”-“,就不需要参数了。
也正是因为这个原因,友元函数实现的操作符重载是有限制的,
比如下标[] ,调用(),成员指向-> 复制= 等不能利用友元函数实现运算符的重载。
在实际开发过程中,单目运算符建议重载为成员函数,而双目运算符建议重载为友元函数。
通常下双目运算符重载为友元函数比重载为成员函数更方便,但是有时双目运算符必须重载为成员函数,例如赋值运算符=。
还有如果需要修改对象内部的状态,一般可以选择利用类成员函数进行修改。