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;
}