C++中的运算符重载

C++ 允许在同一作用域中的某个 函数运算符指定多个定义,分别称为 函数重载运算符重载
重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。当您调用一个 重载函数重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为 重载决策。 ——菜鸟教程

运算符重载概念

类是用户自己定义的类型,同一类创建的对象往往需要进行加减乘除的操作,但是运算符默认只能处理基本数据类型(整数浮点数等),这时就需要在类的作用域中使用运算符重载(让运算符支持此类对象的运算符操作)。

可以被重载的运算符

算术运算符:+、-、*、/、%、++、--
位操作运算符:&、|、~、^(位异或)、<<(左移)、>>(右移)
逻辑运算符:!、&&、||
比较运算符:<、>、>=、<=、==、!=
赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
其他运算符:[]、()、->、,、new、delete、new[]、delete[]

不可以被重载的运算符

成员运算符 .
指针运算符 *
三目运算符 ? :
sizeof
作用域 ::

运算符重载的两种方式

友元函数重载运算符

格式

友元函数需要使用friend关键字说明

friend <函数类型> operator <运算符>( 参数列表 ){
    <函数体>
}

友元函数实现 '+' 的重载

class Integer
{
private:
    int value;
public:
    Integer(int value):value(value){}

    friend Integer operator +(Integer &i1, Integer &i2);
};

Integer operator +(Integer &i1, Integer &i2){
    return i1.value + i2.value; //此处使用了隐式调用构造函数
}

成员函数重载运算符

格式

当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数

<函数类型> operator <运算符>( 参数列表 ){
    <函数体>
}

成员函数实现 '++' 的重载

class Integer
{
private:
    int value;
public:
    Integer(int value):value(value){}

    Integer operator ++();
    Integer operator ++(int); //++后置,需要使用哑元来和++前置进行区分
};

/* ++前置 */
Integer Integer::opeerator ++(){
    return ++(this->value);
}
/* ++后置 */
Integer Integer::operator ++(int){
    return (this->value)++;
}

运算符重载需要注意

  1. 重载后的运算符不会改变优先级和结合性

  1. 重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不允许创建新的运算符

  1. 运算符重载实际上是函数重载,所以符合函数重载的选择原则

  1. 运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符

  1. 重载运算符的函数不能有默认的参数,否则就改变了运算符的参数个数

你可能感兴趣的:(c++,c++)