C++函式過載和函式模板
函式預設引數
預設引數指的是當函式呼叫中省略了實參時自動使用的一個值。例如,將void wow (int n) 設定成n有預設值1,則當函式呼叫wow() 相當於呼叫wow(1)。這極大的提高了使用函式的靈活性。
對於帶引數列表的函式,必須從左向右新增預設值,也就是說,要為某個引數設定預設值,則必需為他右邊的所有函式都提供預設值。
int harpo(int n, int m = 4, int j = 5); 例如,harpo()原型允許呼叫該函式時提供1個、2個或3個預設值。 int a; a = harpo(2); a = harpo(1, 4); a = harpo(8, 9, 3); 實參按照從左到右的順序依次被付給相應的形參,而不能跳過任何引數,因此下面的呼叫是不允許的。 a = harpo(2, , 4); 注意:只有原型指定了預設值,函式定義與沒有預設引數時完全相同。
#include<iostream> using namespace std; void print(int age,int n=1,const char* s = "Hello Word");//定義帶有預設引數的函式 //為第二個引數和第三個引數分別設定了預設值 int main() { print(10);//相當於呼叫print(10, 1, "Hello Word"); print(12, 2);//相當於呼叫print(12, 2, "Hello Word"); print(14, 3, "name"); //注意 print(13, , "name");//這種呼叫是錯誤的 return 0; } void print(int age,int n,const char* s)//實現帶有預設引數的函式 { cout << "你的年齡是:" << age << endl; cout << "你的排名是:" << n << endl;; cout << "你的名字是" <<s<< endl; cout << endl; }
函式過載
預設引數讓你能夠使用不同數目的引數時呼叫同一個函式,而函式的過載(多型)讓你能後使用多個同名的函式。
函式過載的關鍵是函式的引數列表——也稱為函式特徵標(function signature)。如果兩個函式的引數數目和型別相同,同時引數的排列順序也相同,則他們的特徵標相同,而變數名是否相同已經不重要。
例如可以定義如下函式:
void print(const char* str, int width);//#1 void print(double d, int width);//#2 void print(long l, int width);//#3 void print(int i, int width);//#4 void print(const char* str);//#5
使用print()函式時,編譯器將根據所採取的用法使用有相應特徵標的原型。 print("function", 10);//呼叫#1 print(14.55, 10);//呼叫#2 print(1234L, 14);//呼叫#3 print(12, 10);//呼叫#4 print("function");//呼叫#5
#include<iostream>
using namespace std;
//兩個數值相加過載例項
int add(int x, int y);
double add(double x, double y);
unsigned char add(unsigned char, unsigned char);
int main()
{
cout << add(10, 20) << endl;//呼叫add(int x,int y);
cout << add(2.45, 3.55) << endl;//呼叫add(double x,double y);
cout << (int)add('A', 'B');//呼叫add(unsigne char ,unsigne char);
return 0;
}
int add(int x, int y)
{
return x + y;
}
double add(double x, double y)
{
return x + y;
}
unsigned char add(unsigned char x, unsigned char y)
{
return x + y;
}
函式模板
函式模板是通用的函式描述,也就是說他們使用泛型來定義函式,其中的泛型可用具體的型別替換,通過將型別作為引數傳遞給模板,可以使編譯器生成給型別的函式。
例如上面的函式過載可以用函式模板替代
#include<iostream>
using namespace std;
//template 和 template是關鍵字 T為型別名,尖括號也是必須的 ,template 可以用class代替
template<typename T>
T add(T x, T y)
{
return x + y;
}
int main()
{
cout << add<int>(10, 20) << endl;//相當於呼叫add(int x,int y);
cout << add<double>(2.45, 3.55) << endl;//相當於呼叫add(double x,double y);
return 0;
}
關鍵字template和typename是必須的,除非可以使用關鍵字class代替template,必須使用尖括號,型別名可以任意選擇(這裡是T),只要遵守C++命名規則即可。
這篇文章只是介紹簡單的函式過載和函式模板,謝謝大家。