C++ 引用和函式的高階特性

鋸齒流沙發表於2017-12-27

引用

定義:變數的別名

引用的宣告:型別識別符號 &引用名=目標變數名;

引用的主要功能:作為函式的引數或返回值

void main(){
	int a = 10;
	int &b = a;
	cout <<"引用:"<< b << endl;
	getchar();
}
複製程式碼

EventBus.png

說明:

1、一開始定義引用必須要賦值

2、引用的大小很像指標

3、引用的本質是:指標常量

C++.png

上圖中,p = &b顯示錯誤,是p儲存的地址不能改變。

void modify(int &a){
	a = 200;
}

void modifyB(int * const a)
{
	*a = 150;
}

void main(){
	int a = 10;
	int b = 5;
	//指標常量(這個指標所儲存的地址不能改變)
	int * const p = &a;
	//p = &b; //不能改變

	int x = 5;
	cout << x << endl;
	modify(x);
	cout << x << endl;
	modifyB(&x);
	cout << x << endl;


	getchar();
}
複製程式碼

C++.png

函式

函式的使用通常包含以下幾個步驟:

1)、函式宣告:說明函式的名字、引數、返回型別。

說明:系統函式的宣告通常放在標頭檔案中

2)、函式呼叫:提供呼叫函式,實現相應功能,返回結果

result = square_sum(array, 5);
複製程式碼

3)、函式定義

三種型別引數傳遞 1、值傳遞:(函式不能實現實參值交換功能)

void swap(int a, int b){
	int c = 0;
	c = a;
	a = b;
	b = c;
}
void main(){
	int a = 10;
	int b = 5;
	cout << "交換前:" << "a---->" << a <<" b---->"<< b << endl;
	swap(a,b);
	cout << "交換後:" << "a---->" << a << " b---->" << b << endl;
	getchar();
}
複製程式碼

C++.png

2、指標傳遞:(實參、形參指向同一記憶體空間,函式能實現實參值交換功能)

void swap(int *a,int *b){
	int c = 0;
	c = *a;
	*a = *b;
	*b = c;
}

void main(){
	int a = 10;
	int b = 5;
	cout << "交換前:" << "a---->" << a <<" b---->"<< b << endl;
	swap(a,b);
	cout << "交換後:" << "a---->" << a << " b---->" << b << endl;
	getchar();
}

複製程式碼

C++.png

3、引用傳遞:(形參是引數的別名,函式能實現實參值交換功能。形式更加直觀)

void swap(int &a, int &b){
	int c = 0;
	c = a;
	a = b;
	b = c;
}
void main(){
	int a = 10;
	int b = 5;
	cout << "交換前:" << "a---->" << a <<" b---->"<< b << endl;
	swap(a,b);
	cout << "交換後:" << "a---->" << a << " b---->" << b << endl;
	getchar();
}
複製程式碼

C++.png

行內函數(又稱內建函式或內嵌函式)

行內函數與普通函式的區別:編譯器直接將其函式程式碼插入到呼叫處。這樣呼叫它時,就不會有壓棧出棧問題(函式呼叫時用棧來傳遞引數和控制程式轉移),因而其執行速度很快。

行內函數的宣告與定義:在普通函式的基礎上加inline關鍵字 (這並不意味著加了inline後就一定是行內函數)

inline void modify(int &a){
	a = 200;
}


void main(){
	int a = 10;
	int b = 5;

	modify(a);

	cout << a << endl;

	getchar();
}
複製程式碼

說明: 使用行內函數是一種用空間換時間的措施,若行內函數較長,且呼叫太頻繁時,程式將加長很多。因此,通常只有較短的函式(一般為5個語句以下)才定義為行內函數,對於較長的函式最好作為普通函式處理。

通常,行內函數還有如下的限制:

1)不能有遞迴;

2)不能包含靜態資料;

3)不能包含迴圈;

4)不能包含switch和goto語句;

5)不能包含陣列。 若一個行內函數定義不滿足以上要求,則編譯系統把它當作普通函式對待。

帶有預設引數值的函式

C++還允許在函式宣告或函式定義中為形參指定一個預設值。在呼叫此類含預設值形參的函式時,如果形參有對應的實參,則將實參傳遞給形參;如果省略了實參,則將上述預設值傳遞給形參。

void printa(int a = 20){
	cout << "a的值:" << a << endl;
}

void main(){
	int a = 10;
	int b = 5;

	printa();
	printa(a);//覆蓋預設a的值

	getchar();
}
複製程式碼

C++.png

如果函式有多個預設引數,則預設引數必須是從右向左定義,並且在一個預設引數的右邊不能有未指定預設值的引數。(原因:編譯器在實參與形參對應時是按從左到右順序進行的)

特別注意:如果在函式原型的宣告中設定了函式引數的預設值,則不可再在函式定義的頭部重複設定,否則編譯時將出錯。

過載函式

C++允許用同一個函式名定義多個函式(即“一名多用”),這些函式的引數個數或引數型別不同。這就是函式過載(function overloading)。 優點:便於記憶

void printa(int a){
	cout << "a的值:" << a << endl;
}
void printa(float a, int b){
	cout << "a的值:" << a << endl;
}
void printa(double a,int b,int c){
	cout << "a的值:" << a << endl;
}
void printa(char* c, int a){
	cout << "a的值:" << a << endl;
}

void main(){
	int a = 10;
	int b = 5;

	printa(a);//覆蓋預設a的值

	getchar();
}
複製程式碼

區分依據標準:通過函式的引數個數、引數型別、引數順序不同來區分

注意:過載函式的使用與普通函式類似,每一個函式都要進行宣告與定義。

(4)注意事項:

1)不可以定義兩個具有相同名稱、相同引數型別和相同引數個數,只是函式返回值不同的函式

2)如果某個函式引數有預設值,必須保證其引數預設後呼叫形式不與其它函式混淆。

系統函式

標準C++函式:各種編譯環境普遍支援,具有良好的移植性,建議優先使用。

標頭檔案:如 cmath(或math.h)、 cstdlib(或stdlib.h)等

參考網站:http ://www.cppreference.com

非標準C++函式:當前作業系統或編譯環境特有的,如:檔案操作函式等。不同系統薦在差異,即是同一系統也有不同版本的不同。

相關文章