C++語言程序設計基礎課程筆記03

本文將介紹 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 更嚴格的語法

  • 要求函數體的全部參數是 constexpr 時,返回值也是 constexpr
  • 函數中只能有return語句

有什麼用呢,總結來講,就是 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++ 須要注意的就是參數傳遞和函數聲明。

相關文章
相關標籤/搜索