天天看點

C++學習日記13——遞歸、内聯、函數重載、變量的作用域和存儲類型一、遞歸函數二、内聯函數三、函數重載

一、遞歸函數

定義:遞歸函數是直接或間接地調用了自身的函數 用法:利用遞歸算法可以将一個規模較大的問題轉化為規模較小的同類問題來求解。 特征:1、定義中包含函數本身(即遞歸公式)    2、必須有終止條件

遞歸調用階段:    1、遞推:将原問題不斷分解為新的規模更小的問題,逐漸從未知向已知方向推測。(由大到小)    2、回歸:是從已知條件出發,按遞推的逆過程,逐個求值,最後到達遞推的開頭,解決原問題。(由小到大)

注:不建議使用遞歸函數,因為占用記憶體資源較大,是以在使用疊代的時候,盡量不使用遞歸

二、内聯函數

解決:程式通過一組函數實作是一種好的方法,但是函數調用涉及執行時間的開銷。

1、C++提供的内聯函數可以減少函數調用的開銷。 内聯函數的定義格式: inline <函數值類型> <函數名>  (<形式參數表>) { 函數體

}

2、對于編譯系統,它将程式中調用調用内聯函數的語句(或表達式)用内聯函數體中的代碼進行替換。 這樣在執行時就避免了對内聯函數的調用,進而減少了因函數調用所增加的時間開銷,提高了程式運作的效率。

3、使用内聯函數可以節省運作時間,但卻增加了目标程式的長度。是以一般隻将規模很小而使用頻繁的簡單函數聲明為内聯函數。

4、編譯程式在遇到内聯函數時,就用内聯函數代碼替代調用式。

三、函數重載

定義:函數重載是指在一個程式中,可以定義多個具有相同函數名,不同參數清單的函數(至少參數的類型或參數個數或參數類型的順序不同)。這些函數被稱為重載函數。

1、當調用一個重載函數時,編譯系統将通過檢查函數調用中的實參個數、類型和順序來選擇恰當的函數 2、重載函數通常用于實作功能類似而所處理的資料類型不同的問題。

情況一:函數名相同,但參數類型和函數傳回值不同 int max(int a,int b); double max(double a,double b);

情況二:函數名相同,形參類型相同,但個數不同的函數重載 int max(int a, int b); int max(int  a, int b, int c); int max(int  a, int b, int c, int t);

注:如果隻是函數傳回值不同,則不能構成重載函數

Code

#include <iostream>
using namespace std;
//function1
int iabs(int a)
{
	return a > 0 ? a : -a;	//	三目運算符
}

//function2
double iabs(double a)
{
	return a > 0 ? a : -a;
}

//function3 : error
//double iabs(int a)
//{
//
//}

int main()
{
	cout << iabs(9) << endl;
	cout << iabs(-8.8) << endl;
	return 0;
}           

四、變量的作用域和存儲類型

一、作用域 定義:變量的作用域是指變量的使用範圍。 根據變量的使用範圍不同,C++中的變量被分為局部變量和全局變量

1、局部變量——在一個函數内或複合語句内定義的變量 作用範圍:目前函數或複合語句中,不可在此之外使用 函數的形參也屬于局部變量

局部變量在函數或複合語句執行完畢後将自動釋放,所在在不同的函數或複合語句中定義同名的局部變量,也不會互相幹擾。

2、全局變量——說明于所有函數之外 作用範圍:從定義點到整個源程式的結束。 在定義點之前,如果其它函數要引用全局變量,可以在該函數中用extern對全局變量進行聲明。 可以為所有函數共同使用,可以在各個函數之間建立資料的傳輸通道。 函數中局部變量優先于全局變量。

注:在函數中,當局部變量于全局變量同名時,遵循“局部變量優先”的原則。這時,如果想使用全局變量,應該在變量名前加上作用運算符“::”即可。

二、存儲類型

不同的變量所配置設定的存儲區域不同,這就是變量的存儲類型。 1、C++程式運作使用的記憶體區域

C++學習日記13——遞歸、内聯、函數重載、變量的作用域和存儲類型一、遞歸函數二、内聯函數三、函數重載

2、變量的存儲類型 變量在記憶體中存儲的方式,主要存儲類型有auto(自動類)、register(寄存器類)、static(靜态類)、extern(外部類) 變量定義格式: <存儲類型> <資料類型> <變量名>  如 static int a; 

自動變量——auto修飾 自動變量的生命期開始于塊的執行,終止于塊的結束。

寄存器變量——用register修飾 僅局部變量和形參可作為寄存器變量。

靜态變量——用static修飾 配置設定在全局資料區中,定義時系統提供預設的初始值。 靜态變量具有全局生命期。 根據聲明的位置不同,靜态變量又分為靜态局部變量和靜态全局變量。 靜态局部變量是在“塊”中定義的靜态變量。它具有局部作用域,卻有全局生命期。在“塊”執行結束後,該靜态局部變量并不釋放(其值依舊存在,為最後一次狀态值),以便下次調用時可繼續使用(即在被調用的函數中,其值作為上一次狀态值而使用)

靜态全局變量:全局變量可以在其它源檔案中使用,如果在全局變量前加上static修飾符,則生成靜态全局變量,靜态全局變量隻能在本檔案中使用。

外部變量——extern修飾 一個源檔案中定義的全局變量要在其它源檔案中使用,則在使用前一個用extern進行聲明,表示該全局變量不是在本檔案中定義的。如在1.cpp檔案中,定義全局變量 int a=100;  若想在2.cpp檔案中使用1.cpp中的a變量,則可在2.cpp檔案中聲明extern int a;

繼續閱讀