1. 程式人生 > >C++函式過載和函式模板

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++命名規則即可。

這篇文章只是介紹簡單的函式過載和函式模板,謝謝大家。