天天看點

C++四種程式設計範式及例子1. 面向過程(Procedure Programming, PP)2. 面向對象(Object Oriented Programming, OOP)3. 泛型程式設計(Generic Programming,GP)4. 函數程式設計(Lambda 表達式實作)

C++四種程式設計範式及例子

  • 1. 面向過程(Procedure Programming, PP)
  • 2. 面向對象(Object Oriented Programming, OOP)
  • 3. 泛型程式設計(Generic Programming,GP)
  • 4. 函數程式設計(Lambda 表達式實作)
      • 參考

這兩天正好聽了 胡船長 四堂很不錯的網課,把第一堂課涉及到的C++中用四種方式實作add()即兩個數加法運算總結一下,順便查閱補充一下自身的理論知識。

1. 面向過程(Procedure Programming, PP)

面向過程程式設計(Procedure Programming, PP),也被稱為指令式程式設計,也是大家最為熟悉的一種傳統的程式設計方式。從本質上講,它是“馮.諾伊曼機“運作機制的抽象,它的程式設計思維方式源于計算機指令的順序排列。

面向過程程式設計的步驟:

首先,我們必須将待解問題的解決方案抽象為一系列概念化的步驟。然後通過程式設計的方式将這些步驟轉化為程式指令集(算法),而這些指令按照一定的順序排列,用來說明如何執行一個任務或解決一個問題。這就意味着,程式員必須要知道程式要完成什麼,并且告訴計算機如何來進行所需的計算工作,包括每個細節操作。簡言之,就是将計算機看作一個善始善終服從指令的裝置。

代碼如下:

int add(int a, int b) {
    return a + b;
}
           

2. 面向對象(Object Oriented Programming, OOP)

面向對象程式設計(Object Oriented Programming, OOP),包含類、對象、封裝、繼承、多态、重載等機制,通過類和類之間的消息機制模組化,提倡針對不同的場景問題建構不同的資料結構,通過方法的調用或消息的互通實作程式互動。就C++而言,OOP 的意思是利用類層級(classhierarchies)及虛函數進行程式設計,進而可以通過精制的接口操作各種類型的對象,并且程式本身也可以通過派生(derivation)進行功能增量擴充。

托馬斯.庫恩提出“科學的革命”的範式論之後,Robert Floyd在1979年圖靈獎的頒獎演說中使用了程式設計範式一詞。程式設計範式一般包括三個方面,以OOP為例:

包括三個方面,以OOP為例:

1. 學科的邏輯體系——規則範式:如類/對象、繼承、動态綁定、方法改寫、對象替換等等機制。

2. 心理認知因素——心理範式:按照面向對象程式設計之父Alan Kay的觀點,“計算就是模拟”。OOP範式極其重視隐喻(metaphor)的價值,通過拟人化,按照自然的方式模拟自然。

3.自然觀/世界觀——觀念範式:強調程式的組織技術,視程式為松散耦合的對象/類的集合,以繼承機制将類組織成一個層次結構,把程式運作視為互相服務的對象們之間的對話。

class AddClass {
public :
    int operator()(int a, int b) {               // 類中重載()
        return a + b;
    }
};
           

3. 泛型程式設計(Generic Programming,GP)

所謂泛型程式設計就是獨立于任何特定類型的方式編寫代碼,使用泛型程式時,需要提供具體陳旭執行個體所操作的類型或者值。我們經常用到STL容器、疊代器、和算法都是泛型程式設計的例子;

  1. 模闆是C++支援參數化多态的工具,使用模闆可以使使用者為類或者函數聲明一種一般模式,使得類中的某些資料成員或者成員函數的參數、傳回值取得任意類型;
  2. 模闆是一種對類型進行參數化的工具;
  3. 通常有兩種形式:函數模闆和類模闆;
  4. 函數模闆針對僅參數類型不同的函數;
  5. 類模闆針對僅資料成員和成員函數類型不同的類;
  6. 使用模闆的目的就是能夠讓程式員編寫與類型無關的代碼。比如編寫了一個交換兩個整型int 類型的swap函數,這個函數就隻能實作int 型,對double,字元這些類型無法實作,要實作這些類型的交換就要重新編寫另一個swap函數。使用模闆的目的就是要讓這程式的實作與類型無關,比如一個swap模闆函數,即可以實作int 型,又可以實作double型的交換。具體關于C++泛型程式設計例子
// 模闆函數
template<typename T, typename U>
auto add3(T &&a, U &&b) -> decltype(a + b) {              // decltype為類型說明符
    return a + b;
}
           

其中上面程式decltype(a + b)中decltype為C++11新标準引進的類型說明符,他的作用是傳回操作數的資料類型,編譯器分析表達式得到它的類型,去不實際計算表達式的值。這樣可以通過表達式推斷出要定義的變量類型,但是不用該表達式的值初始化變量,有點類似auto,auto在初始化可以用,如下:

4. 函數程式設計(Lambda 表達式實作)

函數式程式設計,是将程式描述為表達式和變換,以數學方程的形式建立模型,并且盡量避免可變的狀态。C++11中引入了lambda表達式的概念。一個lambda表達式辨別一個可調用的代碼單元,我們可以将其了解為一個未命名的内聯函數。

一個lambda表達式具有如下形式:

捕獲清單->傳回類型{函數體}

我們可以忽略參數清單、箭頭和傳回類型,但必須永遠包含捕獲清單和函數體。我們可以按照下面的方式定義一個實作add的lambda表達式:

綜上,1.2.3.4關于C++中用四種方式實作add()到此完畢,附上最終運作代碼:

/*************************************************************************
	> File Name: add.cpp
	> Author:
	> Mail: 
	> Created Time:
 ************************************************************************/

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <stack>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <vector>
using namespace std;

int add(int a, int b) {
    return a + b;
}

class AddClass {
public :
    int operator()(int a, int b) {
        return a + b;
    }
};

template<typename T, typename U>
auto add3(T &&a, U &&b) -> decltype(a + b) {
    return a + b;
}

auto add4 = [](int a, int b) -> int {
    return a + b;
};


int main() {
    AddClass add2;
    cout << add(3, 4) << endl;
    cout << add2(3, 4) << endl;
    cout << add3(3, 4) << endl;
    cout << add4(3, 4) << endl;

    A a;
    a = 3;
    return 0;
}
           

參考

[1] https://blog.csdn.net/richenyunqi/article/details/89530589

[2] http://blog.sae.sina.com.cn/archives/3218