一、為什麼C語言不支援函數重載而c++能支援
什麼是函數重載?為什麼C語言不支援函數重載,而c++能支援函數重載?
解析:
函數重載是用來描述同名函數具有相同或者相似的功能,但資料類型或者是參數不同的函數管理操作。在C語言裡需要寫兩個不同名稱的函數來進行區分。
int add1(int a, int b)
{
return a+b;
}
float add2(float a, float b)
{
return a+b;
}
上面的代碼寫的不太好,這兩個具備相似操作的函數,卻給它們取了兩個不同的名字,這樣做不便于管理。是以,c++為了友善程式員編寫,引入了函數重載的概念。例如下面的代碼:
#include <iostream>
using namespace std;
class Test
{
public:
int add(int x, int y) //相加,傳入參數以及傳回值都是int
{
return x+y;
}
float add(float x, float y) //相加,傳入參數以及傳回值都是float
{
return x+y;
}
};
int add(int x, int y) //相加,傳入參數以及傳回值都是int
{
return x+y;
}
float add(float x, float y) //相加,傳入參數以及傳回值都是float
{
return x+y;
}
int main()
{
int i = add(1, 2);
float f = add(1.1f, 2.2f);
Test test;
int i1 = test.add(3, 4);
float f1 = test.add(3.3f, 4.4f);
cout<<"i = "<<i<<endl;
cout<<"f = "<<f<<endl;
cout<<"i1 = "<<i1<<endl;
cout<<"f1 = "<<f1<<endl;
return 0;
}
上面的程式中使用了全局函數和類成員函數的重載,代碼30~39行是對它們的調用與測試。可以看到,在c++中可以根據傳入參數類型和傳回類型來區分不同的重載函數。
C語言不支援函數重載,c++卻支援,為什麼呢?這是因為c++的重載函數經過編譯器處理之後,兩個函數的符号是不相同的。例如代碼第18行的add函數,經過處理後變成了_int_add_int_int之類,而後者變成了_float_add_float_float之類。這樣的名字包含了函數名、函數參數數量及傳回類型資訊,c++就是靠這種機制來實作函數重載的。
總結:
函數重載是用來描述同名函數具有相同或者相似的功能,但資料類型或者是參數不同的函數管理操作。
函數名經過c++編譯器處理後包含了原函數名、函數參數數量及傳回類型資訊,而C語言不會對函數進行處理。
二、判斷題——函數重載的正确聲明
(A) int calc(int, int);
int cale(const int, const int);
(B) int get();
double get();
(C) int *reset(int*);
double *reset(double*);
(D) extern "C" int compute(int *, int);
extern "C" double compute(double*, double);
A錯誤。第二個函數被視為重複聲明,第二個聲明中的const修飾詞會被忽略。
B錯誤。第二個聲明是錯誤的,因為單就函數的傳回值而言,不足以區分兩個函數的重載。
C正确。這是合法的聲明,reset()函數被重載。
D錯誤。第二個函數聲明是錯誤的,因為在一組重載函數中,隻能有一個函數被指定為extern "C"
三、重載和覆寫有什麼差別
重載是指子類改寫了父類的方法,覆寫是指同一個函數的不同版本之間參數不同。
重載是編寫一個與已有函數同名但是參數表不同(參數數量或參數類型不同)的方法,它具有如下特征:
(1)方法名必須相同。
(2)參數清單必須不相同,與參數清單的順序無關。
(3)傳回值類型可以不相同。
覆寫是派生類重寫基類的虛函數,它具有如下如示的特征。
(1)隻有虛函數的抽象方法才能被覆寫。
(2)相同的函數名
(3)相同的參數清單
(4)相同的傳回值類型
重載是一種文法規則,有編譯器在編譯階段完成,不屬于面向對象程式設計;而覆寫是由運作階段決定的,是面向對象程式設計的重要特征。