第十二章 运算符重载

简介:operator overloading只是一种syntactic sugar,即它只是另一种函数调用的方式。

运算符重载就是对现有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

12.1 两个极端

只有那些包含用户自定义类型的表达式才能有重载的运算符。

12.2 语法

定义重载的运算符就像定义函数,只是该运算符函数的函数名是operator@

返回类型   operator运算符号(形参列表)
{
       函数体
}

函数参数表中参数的个数取决于两个因素:

1. 运算符是一元的还是二元的
2. 运算符被定义为全局函数还是成员函数

12.3 可重载的运算符

运算符重载是相当受限制的:
1. 不能使用C中当前没有意义的运算符
2. 不能改变运算符的优先级
3. 不能改变运算符的参数个数

注意:  .     .*    ::    ?:    sizeof 不能重载

(1)运算符重载为类的成员函数

class 类名{
    ……
    返回类型  operator运算符号(形参列表)
    {
       函数体

    }
    ……
}

或者

class 类名
{
    ……
    返回类型  operator运算符号(形参列表);
    ……
}

返回类型  类名::operator运算符号(形参列表)
{
函数体
}

当运算符重载为成员函数时,运算符函数的形参个数比运算符规定的运算对象个数要少一个。
原因:类的非静态成员函数都有一个隐含的this指针,运算符函数可以用this指针隐式访问类对象的成员,不需要放进形参列表进行传递。少了的运算对象就是该对象本身。


(2)运算符重载为类的友元

class 类名
{
    ……
    //友元声明
    friend 返回类型  operator运算符号(形参列表);
    ……
}

返回类型  operator运算符号(形参列表)
{
函数体
}

当运算符重载为成员函数时,运算符函数的形参个数比运算符规定的运算对象个数一致。

operator=只允许作为成员函数

返回值优化

12.6 自动类型转换

关键字explicit(只能用于构造函数)可以用来阻止构造函数转换

你可能感兴趣的:(第十二章 运算符重载)