运算符重载:
发生在类类型中,目的是让表达式看起来更加自然,简化程序员工作量。但本质是函数调用,实质并没有简化。
例如创建复数类Complex,两个复数类进行加法。
这时不能把自定义的两个类直接相加,可以写一个成员函数:
Complex Complex::plus(const Complex tmp);
加法是使用频繁最高的,这意味着程序员会频繁地调用函数,要多敲好些键盘——这对程序员来说是会心一击。
常见的运算符重载指的是一元和二元运算符(±*/%!&~[]==等)。
例如以成员函数重载+号:
Complex Complex::operator+(const Complex &tmp);
这样,当代码遇到两个复数相加时便会自动转换为函数调用。
cpx1 + cpx2 --> cpx1.operator+(cpx2);
运算符重载当且仅当两种情况下可以写在类的成员函数中并且被编译器调用:
1.二元运算符的左边是该类的对象。
2.一元运算符的操作数是该类的对象。
当二元运算符的左操作数不是该类的对象时,不能转换成 对象1.运算符(对象2)的形式,例如cout << Complex。
这时可以声明为该类的友元函数:
friend std::ostream &operator<<(std::ostream &output, const Complex &cpx);
cin和cout这类的智能对象在内部就重载了<<和>>以输入输出不同结果。
转换构造函数:
可以将类类型转化为用户指定的类型(基本类型、其它自定义类型),它类似于强制转换运算符。
系统自带的强转运算符知道如何把int–>long,但不知道如何把int–>Complex。
为此,c++提供了转换构造函数这种语法:
Complex::operator int() const; //把Complex类型转换为int类型
Complex::operator OtherClass() const; //把Complex类型转换为其它类类型
运算符重载和转换构造函数在某种情况下可以互相代替。例如:
class Complex
{
public:
Complex(double a = 0, double b = 0):shi(a), xu(b){}
Complex operator+ (double a) const
{
return Complex(shi + a, xu);
}
operator double() const
{
return shi;
}
private:
double shi;
double xu;
};
int main()
{
Complex cpx;
cpx = cpx + 1; //运算符重载和转换构造函数都可以
return 0;
}
以上代码在VS2012中会error,在gcc中会warning。
“Complex::operator +”: 2 个重载有相似的转换
可能是“Complex Complex::operator +(double) const”
或 “内置 C++ operator+(double, int)”(error)
两者达到的效果相同,运算符重载和转换构造函数两种方式在此相等。