目錄
1. 原型句法
2. 函數分類
3. 函數參數之按值傳遞
4. 數組作為函數參數
在C++中,要使用函數,必須要有這三個方面:
- 函數原型,函數原型描述了函數到編譯器的接口,函數原型一般放在include文件中。函數原型告訴編譯器需要提供什么樣的形參,如果程序沒有提供這樣的形參,原型將讓編譯器能夠捕獲這種錯誤。
- 函數定義。
- 調用函數,函數調用是一個語句。
可能很多初學者會問,有了函數定義為什么需要函數原型?
C++允許一個程序放在多個文件中單獨編譯,然后再將它們組合起來。在這種情況下,編譯器在編譯main()函數時,可能無法訪問函數定義的代碼。
總的來說,函數原型有3個作用:
- 使編譯器能正確處理函數返回值;
- 使編譯器能檢查使用的參數數目是否正確;
- 使編譯器能檢查使用的參數類型是否正確;
避免使用函數原型的唯一方法是在main()函數之前定義它。但C++的編程風格是將main()函數放在最前面,因為它通常提供了程序的整體風格。
1. 原型句法
- 原型句法是一條語句,因此必須以分號結束;
- 獲得原型最簡單的方法是復制函數定義中的函數頭,并添加分號;
- 函數原型不要求提供變量名,有類型列表即可。參數列表可以包括變量名,也可以不包括變量名,原型中的變量名相當于占位符,不必與函數定義中的變量名相同。在函數定義中形參變量名一般用_a, _b, _c形式的命名方式。
C++占位符相關知識:
(1)auto:在C++11及以后,auto可以為類型占位符,由編譯器推導類型。如:
auto x=2; //x被推導為int類型
(2)格式化輸出時,占位符用于指定變量插入的位置和格式,如:
printf("Number: %d, string: %s", 2, "hello");
2. 函數分類
函數分為兩類:
- 沒有返回值的函數,稱為void函數,通用格式為:
void functionName(paralist)
{statements;return;//optional
}
- 有返回值的函數,通用格式為:
typeName functionName(paralist)
{statements;return value;//optional
}
對于有返回值的函數,必須使用返回語句,以便將返回值傳遞給調用函數。C++對于返回值的類型有一定的限制,不能是數組,但可以是其他任何類型——整型,浮點型,指針,甚至可以是結構體和對象。(雖然C++不能直接返回數組,但可以將數組作為結構體或對象的組成部分來返回)
返回語句也可以是一個表達式。
3. 函數參數之按值傳遞
按值傳遞的函數參數,形參使用的是實參數據的拷貝,在函數中改變形參的值不會改變實參的值。
在函數中聲明的變量(包括形參)都是該函數私有的。在函數被調用時,計算機將為這些變量分配內存,函數調用結束后,這些變量所占用的內存被釋放,這樣的變量被稱為局部變量,因為它們被限制在函數中,也被稱為自動變量,因為它們的內存在程序執行過程中自動分配和自動釋放的,不需要人為干預。
4. 數組作為函數參數
將數據作為函數參數時,需要將數組的大小一并傳遞,因為數組名只代表了數組的首地址,如果不傳遞數組長度,函數就無法數組的長度。以下實例可以更好的了解數組作為函數參數時為何一定要把長度也傳遞給函數。
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int sum_arr(int arr[], int n);
int main()
{int cookies[6] = { 1,2,4,6,8,10 };cout << "size of cookers: " << sizeof(cookies) << endl;cout << "size of cookers[0]: " << sizeof(cookies[0]) << endl;cout << "size of &cookers[0]: " << sizeof(&cookies[0]) << endl;int sum = sum_arr(cookies, 6);cout << "sum: " << sum << endl;return 0;
}int sum_arr(int arr[], int n)
{int total = 0;cout << "size of arr: " << sizeof(arr) << endl;for (int i = 0; i < n; i++){total = total + arr[i];}return total;
}
以下為輸出結果,cookies=24表示數組所占的字節數為24,cookies[0]=4表示第一個元素所占的字節數為4,因為數組總共有6個元素,所以沒有問題。 &cookies[0]表示的是數組的首地址,大小為8個字節,傳遞給函數時使用的是數組名,在函數中輸出arr的大小也是8個字節,說明數組名作為函數參數時只傳遞數組的地址(首地址),不會傳遞整個數組所有的元素值。
?將實例代碼中的函數調用換成如下參數:
int sum = sum_arr(cookies+2, 3);
表示傳遞的是數組第3個元素的地址,并且設置了數組的長度為3,即只求第3,4,5三個元素的和,所以結果應該是18,程序運行結果如下:
?