运算符重载的语法形式 运算符是通过运算符重载函数来完成重载的。 运算符重载函数是成员函数时,语法形式为: type className: operator@(parameter list) type是返回类型 className是重载该运算符的类的类名 重载运算符时使用 operator关键字,@表示被重载的运 算符," operator@“称为运算符函数 当运算符函数不属于某个类时,一般将此函数声明 为类的友元函数,语法形式为: type operator@(parameter list); 2021/2/10
2021/2/10 11 运算符重载的语法形式 • 运算符是通过运算符重载函数来完成重载的。 • 运算符重载函数是成员函数时,语法形式为: type className::operator@(parameter list); – type是返回类型 – className是重载该运算符的类的类名 – 重载运算符时使用operator关键字, @表示被重载的运 算符, ”operator@”称为运算符函数 • 当运算符函数不属于某个类时,一般将此函数声明 为类的友元函数,语法形式为: type operator@(parameter list);
几点注意 ·当运算符被重载时,它是被绑定在一个特定 的类型之上的。当此运算符不作用在特定类 型上时,它将保持原有的含义。 当重载运算符时,不能创造新的运算符符号 例如不能用“*”来表示求幂运算符。 另外,我们应当尽可能保持重载运算符原有 的语义。试想,如果在某个程序中用“+表 示减,“*”表示除,那么这个程序读起来将 会非常别扭。 2021/2/10 12
2021/2/10 12 • 当运算符被重载时,它是被绑定在一个特定 的类型之上的。当此运算符不作用在特定类 型上时,它将保持原有的含义。 • 当重载运算符时,不能创造新的运算符符号, 例如不能用“**”来表示求幂运算符。 • 另外,我们应当尽可能保持重载运算符原有 的语义。试想,如果在某个程序中用“+”表 示减, “*”表示除,那么这个程序读起来将 会非常别扭。 几点注意
用友元函数重载运算符 ·用成员函数重载运算符会碰到麻烦: class Complex( public Complex operator+( Complex c) Complex t; tre=re + cre; t im=im +c im; return t. void main( Complex cl(1, 2); c1=c1+27;/正确,相当于c1=cl. operator+( Complex(27) c1=27+cl;/错误,被解释为无意义的c1l=27. operator+(c1)
2021/2/10 13 用友元函数重载运算符 class Complex{ …… public: Complex operator+(Complex c){ Complex t; t.re = re + c.re; t.im = im + c.im; return t; } }; void main( ) { Complex c1(1, 2); c1 = c1 + 27; //正确,相当于c1=c1.operator+(Complex(27)) c1 =27+c1;//错误,被解释为无意义的c1=27.operator+(c1) } • 用成员函数重载运算符会碰到麻烦:
可以用友元函数实现运算符重载,此时能够 很容易地将27隐式转换为 Complex类型 class Complext public: Complex operator+(Complex cl, Complex c2) cl re c2re; t im=clim+ c2. im 请思考,能不能同时存在以下两个函数 Cornplex operator-F(Cornplex co, 3; friend Complex operator+(Complex cl, Complex c2)ooo3 void main( Complex cl(1, 2); cl=c1+27;∥正确,相当于c1= operator+( cl, Complex(27) c1=27+cl;/正确,相当于cl= operator+( Complex(27),c1) 14
2021/2/10 14 class Complex{ …… public: friend Complex operator+(Complex c1, Complex c2){ Complex t; t.re = c1.re + c2.re; t.im = c1.im + c2.im; return t; } }; void main( ) { Complex c1(1, 2); c1 = c1 + 27; //正确,相当于c1=operator+(c1,Complex(27)) c1 =27+c1;//正确,相当于c1=operator+(Complex(27), c1) } • 可以用友元函数实现运算符重载,此时能够 很容易地将27隐式转换为Complex类型 请思考,能不能同时存在以下两个函数: Complex operator+(Complex c){…} friend Complex operator+(Complex c1, Complex c2){…}
用友元或成员函数重载运算符的一般原则 没有强制要求程序员必须用那种方式来重载 运算符。 如果运算符的操作需要修改类对象的状态 则应该把它实现为成员函数。 ·对于诸如=、、艹等需要左值操作数的运 算符最好重载为成员函数。 如果运算符所需的操作数(尤其是第一个操 作数)希望有隐式类型转换,那么应该实现 为友元函数。 =、()、囗、→不能重载为友元函数。 2021/2/10 15
2021/2/10 15 用友元或成员函数重载运算符的一般原则 • 没有强制要求程序员必须用那种方式来重载 运算符。 • 如果运算符的操作需要修改类对象的状态, 则应该把它实现为成员函数。 • 对于诸如=、+=、++等需要左值操作数的运 算符最好重载为成员函数。 • 如果运算符所需的操作数(尤其是第一个操 作数)希望有隐式类型转换,那么应该实现 为友元函数。 • =、()、[]、->不能重载为友元函数