重载运算
1.基本概念:名字由关键字operator和其后要定义的运算符号共同组成。
对于一个运算符来说,它或者是类的成员,或者至少含有一个类类型的参数。
通常情况下,不应该重载逗号、取地址、逻辑与和逻辑或运算符。
2.当我们定义重载的运算符时,必须首先决定是将其声明为类的成员函数还是声明为一个普通的非成员函数。一般来说
<1>赋值、下标([])、调用(())和成员访问箭头运算符必须是成员。
<2>复合赋值运算符(+=、-=)一般来说应该是成员,但并不绝对。
<3>改变状态的运算符与给定类型密切相关的运算符,如递增、递减和解引用运算符,通常应该是成员。
<3>具有对称性的运算符(a+b和b+a无所谓)可能转换任意一端的运算对象,例如:算术、相等性、关系和位运算符等,通常应该是普通的非成员函数。
注意:当把运算符定义成成员函数时,它的左侧运算对象必须是运算符所属类的一个对象。而普通的非成员函数则没有要求。
string s1 = "wang";
string s2 = "rong" + s1;//若+是string的成员,则发生错误。因为“rong”哪来的成员函数。(所以+是string的非成员函数)
3.函数调用运算符
如果类定义了调用运算符,则该类的对象就被称为函数对象。之所以叫做函数对象,是因为该类对象的行为就和函数一样。
class A
{
public:
int operator()(int val)const
{
return val < 0 ? -val : val;
}
};
int main()
{
int i = -24;
A a;
cout << a(i) << endl;//你看,类A的对象a就和函数一样
system("pause");
return 0;
}
类型转换运算符
类型转换运算符是类的一种特殊成员函数,它负责将一个类类型的值转换成其它类型。格式如下:
operator type() const;
type表示某种类型。类型转换运算符可以面向任意类型(除void)进行定义,只要该类型能作为函数的返回类型。因此,不允许转换成数组或函数类型,但允许转换成指针或引用类型。
注意:类型转换函数必须是类的成员函数,不能声明返回类型,形参列表也必须为空。且类型转换函数通常应该是const。
class A
{
public:
A(int i = 0) :val(i) {}
operator int() const { return val; }
private:
int val;
};
int main()
{
A a;
a = 6;//将6隐式转换成A
int c = a + 3;//将a隐式转换成int,然后执行加法
cout << c << endl;
system("pause");
return 0;
}