21
高高高高高高高高高 高高高高高高高高高

高等程式語言實習課

Embed Size (px)

DESCRIPTION

高等程式語言實習課. http://helldeathscythe.myweb.hinet.net/. Operator overloading. 在 C++ 語言中,

Citation preview

高等程式語言實習課高等程式語言實習課

http://http://helldeathscythe.myweb.hinet.nethelldeathscythe.myweb.hinet.net//

Operator overloadingOperator overloading

在在 C++C++ 語言中,語言中, <<<< 運算符號可以配合運算符號可以配合coutcout 作為字串資料流輸出符號,同樣作為字串資料流輸出符號,同樣也可以作為左移位元運算符號也可以作為左移位元運算符號

+ - + - 可以作為數字的正負,也可以作為可以作為數字的正負,也可以作為加法與減法的運算符號加法與減法的運算符號

因為它們都被超載因為它們都被超載 (overloading)(overloading) 在在 C+C+++ 的類別資料庫中的類別資料庫中

Operator overloadingOperator overloading

使用者自訂的類別使用者自訂的類別

void main()

{

frac f1(1,2),f2(1,3),f3;

if(f1.bigger(f2))

f3.copy(f1.sub(f2));

else

f3.copy(f1.add(f2));

f3.print();

}

原始版 理想版

void main()

{

frac f1(1,2),f2(1,3),f3;

if(f1>f2)

f3=f1-f2;

else

f3=f1+f2;

f3.print();

}

Of course

Why not?

Operator overloadingOperator overloading

二元運算子二元運算子– 算數符號算數符號 : = + - * / += -=: = + - * / += -=– 關係符號關係符號 : > < >= <= == !=: > < >= <= == !=– 邏輯符號邏輯符號 : && || &(and) |(or) ^(xor): && || &(and) |(or) ^(xor)– IO: << >>IO: << >>

一元運算子一元運算子– ++ -- + -++ -- + -

其他其他– new delete -> [] () ,new delete -> [] () ,

Operator overloadingOperator overloading

class ClassName

{

...

// 超載運算子 X, 可能是 +-/*...

return_type operatorX(...)

{

...

}

};

Operator overloadingOperator overloading

class point{int x,y;

public:...// 建構子等其他函數point add(const point &p2){

return point(x+p2.x,y+p2.y);

// 匿名物件}void set(const point &p2){

this->x = p2.x;this->y = p2.u;

}

};

class point{ int x,y;public: ...// 建構子等其他函數 point operator+(const point &p2){

point p(x+p2.x,y+p2.y);retrun p;

} void operator=(const point &p2){

x = p2.x;y = p2.u;

}};

原始版 運算子超載

Operator overloadingOperator overloading

p1+p2;

p1=p2;

p3=p1+p2;

if (p1>p2)

p1=p2;

else

p2=p1;

p1.operato+(p2);

p1.operator=(p2);

p3.operator=(p1.operator+(p2));

if(p1.operator>(p2))

p1.operator=(p2);

else

p2.operator=(p1);

Operator overloadingOperator overloading

這是什麼這是什麼 ??

p3+p1-p2;

p3+p2*p1;

p2*p1+p3;

p1=p2=p3;

f1=p2[1];

p1++;

p1+2;

p3.operator+(p1.operator-(p2));

p1.operator+(p2.operator*(p3));

p3.operator+(p2.operator*(p1));

p1.operator=(p2.operator=(p3));

f1.operator=(p2.operator[](1));

p1.operator++();

p1.operator+(2);

?

*Operator overloading*Operator overloading

細談細談 operator=()operator=()– 當類別含有指標成員時一定要當類別含有指標成員時一定要

建構子 建構子 Copy ConstructorCopy Constructor 超載 超載 Operator =();Operator =(); 解構子解構子 DestructorDestructor

*Operator overloading*Operator overloading

Int* A 0X001125

0

1

2

3

4

5

List L1 = List L2

Int* A 0X001125

*Operator overloading*Operator overloading

Int* A 0X001125

0

1

2

3

4

5

List L1 = List L2

Int* A 0X001256 0

1

2

3

4

5

*Operator overloading*Operator overloading

operator=()operator=() 的程式步驟的程式步驟1.1. x1 == x1 ?x1 == x1 ?2.2. x1x1 陣列長度 陣列長度 = x2= x2 陣列長度 陣列長度 ??3.3. delete x1;delete x1;4.4. x1 = new type[x2.size()];x1 = new type[x2.size()];5.5. 複製複製 x2 to x1x2 to x16.6. return *this;return *this;

Operator overloadingOperator overloading

++++ 前置與後置前置與後置class point{

int x,y;public:

...point& operator++(){ // 前置 prefix ++i

++x; ++y;retrun *this;

}point operator++(int){ // 後置 postfix i++;

point p(*this);x++; y++;return p;

}};

Operator overloadingOperator overloading

-(-( 負號負號 )) 的超載的超載class point{

int x,y;public:

...point& operator-(){

return point(-x,-y);

}};

如果 -( 負號 ) 與 -( 減法 ) 同時被超載,執行時會不會搞混,執行時會不會搞混 ??

更多的更多的 Operator overloading?Operator overloading? Friend Operator functionsFriend Operator functions Type Operator functionsType Operator functions

Friend Operator Friend Operator functionsfunctions 這是什麼這是什麼 ??

p1+2;

2+p1;

p1.operator+(2);

2.operator+(p1); // ???

?

Friend Operator Friend Operator functionsfunctions 提供一個兩個參數的提供一個兩個參數的 operator+operator+

class point{int x,y;...

};point operator+(const point& p1,const point& p2){

...// 寫什麼 ?}int main(){

point p1(3,5),p2(4,7),p3;p3=p1+p2;p3=5+p1;

}注意 : 由於 point 沒有實作 operator+ p1+p2 才會被編譯成 operator+(p1,p2) 5+p1 會被編譯成 operator+(point(5)+p2);

Friend Operator Friend Operator functionsfunctions 提供一個兩個參數的提供一個兩個參數的 operator+operator+

class point{int x,y;friend point operator+(const point& p1,const point& p2);

};point operator+(const point& p1,const point& p2){

retrun point(p1.x+p2.x,p1.y+p2.y);}int main(){

point p1(3,5),p2(4,7),p3;p3=p1+p2;p3=5+p1;

} 你是我的朋友,所以你的東西就是我的東西,所以你的東西就是我的東西 !?!?

Type Operator Type Operator functionsfunctions 資料型態也可以超載資料型態也可以超載

class clock{

int h,m,s;...

};void mian(){

clock c(17,32,43);int sec = int( c ); //17*3600+32*60+43Cout << sec;

}

Type Operator Type Operator functionsfunctions 資料型態也可以超載資料型態也可以超載

class clock{

int h,m,s;operator int(){

return h*3600+m*60+s;}

};void mian(){

clock c(17,32,43);int sec = c; //17*3600+32*60+43Cout << sec;

}