# 運算子重載(operator overloading)
學完物件導向程式設計後可以來了解重載運算子重載,operator overloading也可以叫做運算子覆載,或運算子多載,反正意思差不多,這裡就稱為重載運算子重載,至於為何要使用運算子重載呢?先來看一個例子:
```cpp=
int main(void){
int a = 4, b = 6, c;
c = a + b;
std::cout << c; //output:10
}
```
這個例子中可以很清楚的看到我用一個「加號」將a和b相加,這當然沒問題,那下面這個例子呢?
```cpp=
#include <iostream>
using namespace std;
class data{
public:
int a,b;
data(int,int);
};
data::data(int x = 0,int y = 0){
a = x;
b = y;
}
int main(){
data d1(3,4), d2(6,3), d3;
d3 = d1 + d2;
return 0;
}
```
這個例子中會得到一個錯誤,因為此時這個「加號」它不知道該怎麼用,因為在這個class裡有兩個數,程式不知道要加哪一個,此時我們就會用到運算子重載,重新定義一個運算子,那定義方式如下:
```cpp=
#include <iostream>
using namespace std;
class data{
public:
int a,b;
data(int,int);
void print_data();
data operator+(data &y_data){
int a_plus = a + y_data.a;
int b_plus = b + y_data.b;
data z_data(a_plus,b_plus);
return z_data;
}
};
data::data(int x = 0,int y = 0){
a = x;
b = y;
}
int main(){
data d1(3,4), d2(6,3), d3;
d3 = d1 + d2;
cout << d3.a << " " << d3.b << endl;
return 0;
}
```
此時可以完整解決原本的問題,我們將「加號」定義成第一個物件的a加上第二個物件的b,接著我將它存成z_data,並回傳。
在使用sort()函式時也可以使用運算子重載:
```cpp=
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;
class data{
public:
int a,b;
data(int,int);
bool operator < (data &y_data){
if(b < y_data.b);
else return b < y_data.b;
}
};
data::data(int x = 0,int y = 0){
a = x;
b = y;
}
int main(){
data arr[5];
srand(time(NULL));
for(int i = 0;i < 5;i++){
arr[i].a = i;
arr[i].b = rand()%30+1;
}
for(int i = 0;i < 5;i++) cout << arr[i].a << " " << arr[i].b << endl;
sort(arr,arr+5);
cout << "===========" << endl;
for(int i = 0;i < 5;i++)
cout << arr[i].b << " ";
cout << endl;
return 0;
}
```
此處我們將 `<` 這個符號重新定義,使我們的sort在比較的時候,能清楚知道如何比較,然而我們這邊這樣定義運算子重載是不太好的,好一點的作法如下:
```cpp=
bool const operator < (data &y_data) const {
if(b < y_data.b);
else return b < y_data.b;
}
```
我們加入const關鍵詞,因為我們只需得到資料,並不會更改他們的值,所以此處是read-only的功能,且若不小心改到裡面的資料還會出現error告訴我們,更方便除錯。
##### by 中和高中 吳振榮