运算符重载(C++)(一)

2015-01-22 20:59:38 · 作者: · 浏览: 15
一、运算符重载机制:
?
一元运算符:  @obj => operator @(obj)
?
二元运算符:  obj@obj2 => operator @(obj,obj2)
?
注意:前置++、--与一元运算符处理方式相同,而后置++、--这样处理:obj++ => operator ++(obj,0)
?
二、除了.、.*、::、?:、sizeof这5个运算符之外,其他一概都可以重载。
?
三、普通运算符重载:
?
1.重载为类的友元函数:
?
?
?
?1 #include
?2 using namespace std;
?3?
?4 class Complex
?5 {
?6 ? ? private:
?7 ? ? double real;
?8 ? ? double image;
?9 ? ? public:
10 ? ? Complex(double real=0,double image=0){ this->real=real,this->image=image; }
11 ? ? void display(){ cout<<"("<
12 ? ? friend Complex operator + (Complex A,Complex B){ return Complex(A.real+B.real,A.image+B.image); }//加法
13 ? ? friend Complex operator - (Complex A,Complex B);//减号
14 ? ? friend Complex operator - (Complex A);//负号
15 ? ? friend Complex operator ++ (Complex& A);//前置++
16 ? ? friend Complex operator ++ (Complex& A,int);//后置++
17 };
18 Complex operator - (Complex A,Complex B) { return Complex(A.real-B.real,A.image-B.image); }
19 Complex operator - (Complex A) { return Complex(-A.real,-A.image); }
20 Complex operator ++(Complex& A) { return Complex(++A.real,A.image); }
21 Complex operator ++(Complex& A,int) { return Complex(A.real++,A.image); }
22?
23 int main()
24 {
25 ? ? Complex A(100.0,200.0),B(-10.0,20.0),C;
26 ? ? cout<<"A=";A.display();
27 ? ? cout<<"B=";B.display();
28 ? ? C=A+B;
29 ? ? cout<<"C=A+B=";C.display();
30 ? ? C=A-B;
31 ? ? cout<<"C=A-B=";C.display();
32 ? ? C=-A+B;
33 ? ? cout<<"C=-A+B=";C.display();
34 ? ? C=A++;
35 ? ? cout<<"C=A++,C=";C.display();
36 ? ? C=++A;
37 ? ? cout<<"C=++A,C=";C.display();
38 ? ? C=A+5;
39 ? ? cout<<"C=A+5=";C.display();
40 ? ? return 0;
41 }
?
2.重载为类的成员函数:
?
?
?1 #include
?2 using namespace std;
?3?
?4 class Complex
?5 {
?6 ? ? private:
?7 ? ? double real;
?8 ? ? double image;
?9 ? ? public:
10 ? ? Complex(double real=0,double image=0){ this->
real=real,this->image=image; }
11 ? ? void display(){ cout<<"("<
12 ? ? Complex operator + (Complex B);//加法
13 ? ? Complex operator - (Complex B);//减号
14 ? ? Complex operator - ();//负号
15 ? ? Complex operator ++ ();//前置++
16 ? ? Complex operator ++ (int);//后置++
17 };
18 Complex Complex::operator +(Complex B) { return Complex(real+B.real,image+B.image); }
19 Complex Complex::operator - (Complex B) { return Complex(real-B.real,image-B.image); }
20 Complex Complex::operator - () { return Complex(-real,-image); }
21 Complex Complex::operator ++() { return Complex(++real,image); }
22 Complex Complex::operator ++(int) { return Complex(real++,image); }
23?
24 int main()
25 {
26 ? ? Complex A(100.0,200.0),B(-10.0,20.0),C;
27 ? ? cout<<"A=";A.display();
28 ? ? cout<<"B=";B.display();
29 ? ? C=A+B;
30 ? ? cout<<"C=A+B=";C.display();
31 ? ? C=A-B;
32 ? ? cout<<"C=A-B=";C.display();
33 ? ? C=-A+B;
34 ? ? cout<<"C=-A+B=";C.display();
35 ? ? C=A++;
36 ? ? cout<<"C=A++,C=";C.display();
37 ? ? C=++A;
38 ? ? cout<<"C=++A,C=";C.display();
39 ? ? C=A+5;
40 ? ? cout<<"C=A+5=";C.display();
41 ? ? return 0;
42 }
?
3.两种重载方式的比较:
?
1)一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。
?
2)一些双目运算符不能重载为类的友元函数:=、()、[]、->。
?
3)若一个运算符的操作需要改变对象的状态,选择重载为成员函数较好。
?
4)若运算符所需的操作数(尤其第一个操作数)希望有隐式类型转换,则只能选用友元函数。
?
5)当运算符函数是一个成员函数时,最左边的操作数必须是运算符类的一个类对象或其引用。若左边的操作数必须是一个不同类的对象,或者是
?
一个基本数据类型的对象,该运算符函数必须作为一个友元函数来实现。
?
6)当需要重载运算符的运算具有可交换性时,选择重载为友元函数。
?
四、典型运算符重载:
?
1.重载=进行复数类数据赋值:
?
?
?
?1 #include
?2 using namespace std;
?3?
?4 class Complex
?5 {
?6 ? ? private:
?7 ? ? double real;
?8 ? ? double image;
?9 ? ? public:
10 ? ? Complex(double real=0,double image=0) { this->real=real,this->image=image; }
11 ? ? void display() {