1. 程式人生 > >C++和C語言的區別(一)——函式的區別

C++和C語言的區別(一)——函式的區別

C++有新增的新的特性也有與C語言的一些區別,為了方便學習,就特別對重要的一些特性和區別進行學習。

此次學習的是:1、函式的預設引數,2、inline函式,3、函式過載

 1、C++的函式預設引數:在函式宣告或定義時候,給函式引數預先賦值,當函式呼叫有空缺引數時,就將該值作為預設引數傳入。

(1)預設值必須從右向左一次賦值,不可跳過。

void fun(int a, int b, int c=20);

int main()
{
	fun(11,12);
	return 0;
}

因為我們傳遞引數的時候,都是從左往右傳遞,如果我們只給b賦值,而傳遞了兩個引數,那麼第三個引數就沒有被被初始化了,這是不允許的。

(2)函式預設值只在單檔案有效。

(3)編譯期確定預設值傳入。

2、C++的行內函數:編譯器會把該函式的程式碼副本放置在每個呼叫該函式的地方。

(1)inline函式這樣定義可能有點類似巨集定義但是他們還是有區別的。

(2)編譯期在呼叫點展開,作用域為單檔案

(3)inline只是對編譯器的一種建議,遞迴類的函式不可被處理成行內函數。

3、函式過載:過載宣告是指一個與之前已經在該作用域內宣告過的函式或方法具有相同名稱的宣告,但是它們的引數列表和定義(實現)不相同。

(1)即函式名相同,引數列表不同,作用域相同。

bool compare(int a, int b)
{
	cout << "bool compare(int a, int b)"<<endl;
	return a > b;
}

bool compare(char a, char b)
{
	cout << "bool compare(char a, char b)"<<endl;
	return a > b;
}

bool compare(float a, float b)
{
	cout << "bool compare(float a, float b)" <<endl;
	return a > b;
}

int main()
{
	compare(10, 20);
	compare('a', 'b');
	//compare(10.2, 20.3);

	return 0;
}

 執行結果如下圖:(被我註釋掉的關於隱式型別轉換的問題)

 

(2)可以過載原因是因為與C語言生成的符號不同。

當我們使用C++時候,如果發生函式連結錯誤是如下結果:

 當我們使用C語言.c檔案時候,如果發生函式連結錯誤是如下結果:

 

即:c++       函式符號=函式名+引數列表

       c語言    函式符號=_函式名