105年鐵路特考高員三級程式語言
一、物件導向語言中有所謂 overloading 的方法及建構子 (constructor),請舉例並說明之。(20分) |
答:
(一)多載(Overloading):超荷
1.定義:
多載並非多型,為了區別又稱為靜態多型。例如 C++ 的可以允許在一類別中用同一個函數名稱定義出多個不同的函數,只要這些函數彼此之間在參數個數或資料型態上有差異即可。編譯程式可根據實際參數的個數及型態來決定真正要執行的是那一個超荷函數,因此呼叫敘述與超荷函數之間是靜態繫結的。
2.範例:
在同一個命名區間 (name space) 中兩個函式有同樣的名稱,但是具有不同的參數個數或是參數型態,例如:
class Base { public: virtual void service( ) { } // virtual 可以省略 virtual void service(int x) { } // virtual 可以省略 }; void main( ) { Base bObj; bObj.service( ); bObj.service(10); } |
上例中兩個函式可以是虛擬函式或是一般的函式,不同的類別 (包括繼承時的父類別及子類別) 是不同的 name space,因此父類別與子類別之間的函式沒有 overload 的關係。
(二)建構子(constructor)
1.定義:
是一種初始化其類別執行個體的成員函式。名稱與類別的名稱相同,但沒有傳回值。可以有任意數目的參數,而類別可以有任意數目的多載建構函式。如果您未定義任何建構函式,則編譯器會產生不接受任何參數的預設建構函式;將預設建構函式宣告為已刪除,即可覆寫這個行為。
2.範例:
#include <iostream> using namespace std; class CPoint { public: int x; int y; // 又稱預設建構函式(default constructor) CPoint( ); // 自訂參數的建構函式 CPoint(int x, int y); // 又稱複製建構函式(copy constructor) CPoint(const CPoint &p); }; CPoint::CPoint( ): x(0), y(0) { } // 也可以這樣寫 // CPoint::CPoint( ) { x = 0; y = 0; } CPoint::CPoint(int x, int y) { this->x = x; this->y = y; } CPoint::CPoint(const CPoint &p) { x = p.x; y= p.y; } int main(void) { CPoint p; // 呼叫 CPoint::CPoint( ) CPoint *pP = new CPoint(); CPoint q(2, 3); // 呼叫 CPoint::CPoint(int, int) CPoint *pQ = new CPoint(2, 3); CPoint v = q; // 呼叫 CPoint::CPoint(const CPoint &) printf("v = (%d, %d)\n", v.x, v.y); return 0; } |
執行結果:
v = (2, 3)
留言列表