简介: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(只能用于构造函数)可以用来阻止构造函数转换
网友评论