我們希望在構造pt這個對象的同時,傳遞x坐標和y坐標的值。可以再定義一個構造函數,如例2-8所示。
例2-8
#include <iOStream.h>
class point
{
public:
int x;
int y;
point()
{
x=0;
y=0;
}
point(int a, int b)
{
x=a;
y=b;
}
void output()
{
cout<<x<<endl<<y<<endl;
}
};
void main()
{
point pt(5,5);
pt.output();
}
在這個程序中,有兩個構造函數,它們的函數名是一樣的,只是參數的類型和個數不一樣。這在C語言中是不允許的,而在C++中上述定義是合法的,這就是C++中函數的重載(overload)。當執行main函數中的point pt(5,5)這條語句時,C++編譯器將根據參數的類型和參數的個數來確定執行哪一個構造函數,在這裡即執行point(int a, int b)這個函數。
重載構成的條件:函數的參數類型、參數個數不同,才能構成函數的重載。分析以下兩種情況,是否構成函數的重載。
第一種情況:
(1)void output();
(2)int output();
第二種情況:
(1)void output(int a,int b=5);
(2)void output(int a);
對於第一種情況,當我們在程序中調用output()函數時,讀者認為應該調用的是哪一個函數呢?要注意:只有函數的返回類型不同是不能構成函數的重載的。
對於第二種情況,當我們在程序中調用output(5)時,應該調用的是哪一個函數呢?調用(1)的函數可以嗎?當然是可以的,因為(1)的函數第二個參數有一個默認值,因此可以認為調用的是第一個函數;當然也可以是調用(2)的函數。由於調用有歧義,因此這種情況也不能構成函數的重載。在函數重載時,要注意函數帶有默認參數的這種情況。