本文將介紹 C++ 中 函數的通常用法。函數又稱爲方法,是一段程序代碼。由三部分組成,函數聲明,函數定義 和 函數體。python
例如:ios
// 函數聲明 int add(int a, int b); // 返回值, 函數名, 形參列表 int add(int a, int b) { // 函數體 return a + b; }
調用是能夠被調用的, 調用時須要提供實際參數(實參)列表。c++
這裏常量「cpp」 就是實參, name 就是形參算法
#include <iostream> #include <string> using namespace std; int hi(string name) { cout << "hi" << name << endl; } int main() { cout << "1" << endl; hi("cpp"); cout << "2" << endl; }
語句按照順序執行,遇到函數先執行函數內部,返回以後繼續執行。編程
和大多數程序同樣,函數能夠嵌套,函數中又能夠調用其餘的函數。函數
而函數調用自身,稱爲遞歸,編寫算法的時候常常使用遞歸。優化
unsigned fib(unsigned int n) { if (n == 1) { return 1; } if (n == 2) { return 1; } return fib(n - 2) + fib(n - 1); }
一般遞歸須要退出條件。spa
下面介紹一些要點 和特性, 實參形參和引用、constexpr、默認參數、函數重載code
關於形參和實參,實參就是調用的時候填寫的參數,當執行調用的時候,會發生實形結合。實形結合,就是形參會被分配內存空間,而且實參的值會傳遞給形參。定義的時候形參不佔用內存空間。遞歸
參數傳遞有兩種:
引用 不是變量,是變量的別名,不佔用內存空間,寫法以下:
# 類型& 是一個引用類型 void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } int main() { int x = 1; int y = 2; swap(x, y); cout << "x = " << x << ",y = " << y << endl; }
那麼 a 是一個引用類型 和 實參x的數據進行綁定,是x 的別名,經過雙向傳遞,能夠改變實參的值。
constexpr 是 c++ 中的一個關鍵字,能夠添加到函數的定義或者聲明開頭,這個語法是一個比 const 更嚴格的語法
有什麼用呢,總結來講,就是 constexp r要求編譯時不可變(而 const 只是運行時不可變,編譯時有可能值尚未肯定,仍是變量),即在編譯時能夠推導出來,這樣嚴格約束,一方面描述這是一個常量表達式, 另一方面能夠在編譯時進行優化。
默認參數,這個在python中是支持的,C++ 的寫法相似,容許設置默認的參數,這樣在調用時能夠不提供某些實參,可是默認參數須要從右到左提供,不用都提供。例如:
int test1(int a , int b = 1, int c = 2); // ok int test2(int a = 1, int b ) // error
若是函數聲明中已經寫了默認參數,函數定義中就不用寫默認參數了。
函數重載(overload),是指一個相同名稱的函數,經過參數數量和參數類型的不一樣,有多個版本的功能。例如:
int add(int a , int b); double add(double a, double b);
須要注意的,重載是不支持返回值類型不一樣的。(由於隱式類型轉換的存在,可能引發歧義)。雖說好處的是能夠用同一個方法名,反覆使用,而不用使用addInt addDouble這樣的名稱。對於使用函數的人來講,須要注意的是,因爲使用的參數不一樣,須要肯定其實是調用哪一個方法。
總之,函數是編程中隨處可見的操做,C++ 須要注意的就是參數傳遞和函數聲明。