相关文章推荐
善良的牛肉面  ·  coffe1891/frontend-har ...·  1 年前    · 
善良的牛肉面  ·  标签| 前端指南·  1 年前    · 
善良的牛肉面  ·  聊聊编程范式- 知乎·  1 年前    · 
善良的牛肉面  ·  前端编程范式- 掘金·  1 年前    · 

这两天正好听了 胡船长 四堂很不错的网课,把第一堂课涉及到的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在初始化可以用,如下:

auto f=[](int a,int b){return a+b;};//与上面lambda表达式的声明是等价的

4. 函数编程(Lambda 表达式实现)

函数式编程,是将程序描述为表达式和变换,以数学方程的形式建立模型,并且尽量避免可变的状态。C++11中引入了lambda表达式的概念。一个lambda表达式标识一个可调用的代码单元,我们可以将其理解为一个未命名的内联函数。

一个lambda表达式具有如下形式:
捕获列表->返回类型{函数体}

我们可以忽略参数列表、箭头和返回类型,但必须永远包含捕获列表和函数体。我们可以按照下面的方式定义一个实现add的lambda表达式:

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

综上,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

虽然结构化编程的理念提高了程序的清晰度、可靠性,并使之便于维护。 但是它在编写大型程序时,仍然面临挑战。 在C++中,类是一种规范,它描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。 OOP程序设计方法首先设计类,它们准确地表示了程序要处理的东西。类定义描述了每个类可执行的操作。从低级组织(如类)到高级组织(如程序)的处理过程叫作自下向上的编程。 OOP编程并不仅仅是将数据和方法合并为类定义。多态让您能够为运算符和函数创建多个定义,通过编程上下文来确定使用哪一定义 一、设计模式的六大原则 :1、开闭原则(Open Close Principle)开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。2、里氏代换原则(Liskov Substitution Principle 预计Boson是具有静态和强类型系统的多范式语言。 Boson编译器目前处于初始阶段,具有类型系统和结构范例的惯用语,其功能列表如下所述。 编译器正在积极开发中,并将逐步开发更多范例。 功能性习语 算术运算符 逻辑运算符 关系运算符 复合类型大批 C本机通话消耗 二进制搜索算法 int a[ 10 ] = [ 55 , 98 , 67 , 23 , 1088 , 65 , 44 , 34 , 1 , 7 ]; fn binarySearchA (int l,int t,int r) int { int m; if (l <= r){ m = (l + r) / 2 ; if (a[m] < t){ return b 函数式编程作为结构化编程的一种,正在受到越来越多的重视。工程中不在只是面向对象编程,更多的人尝试着开始使用函数式编程来解决软件工程中遇到的问题。什么是函数式编程?在维基百科中给出了详细的定义,函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ... 与成百种编程语言(Programming Language)相比,编程范式(Programming Paradigm、范式)要少得多。 如图所示,共有27种范式。多数范式之间仅相差一个或几个概念。 主要的范式 最常用的范式有三个:过程试编程面向对象编程(OOP),函数式编程(FP)。然后我们介绍一下新兴的第四种范式也就是面向切面编程(AOP)。 过程试编程 过程式编程(Pro... 多线程在实际编程中的重要性不言而喻,对 C++ 而言,当我们需要使用多线程时,有多种方案可供选择。比如 POSIX 线程 pthread、boost::thread 库、C++11 开始支持的 std::thread 库,以及其他一些第三方库 libdispatch(GCD)和 OpenMP 等等。 至于选择哪种多线程编程方案,需要根据你的实际项目、运行平台、团队协作等因素来考虑。一般而言,如果使用的是 Linux 操作系统,那么可以直接使用系统提供的 pthread 库编写多线程 C++ 程序;如果需要跨 1、系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。 #include <xxx.h> 2、用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,然后在到C++安装目录(比如VC中可以指定和修改库文件查找路径,Unix和Linux中可以通过环境变量来设定)中查找,最后在系统文件中查找。 #include “xxx.h” 编译器的工作过程 第一个阶段是预处理阶段,在正式的编译阶段之前... C++语言是一门面向对象的编程,,它的优点是容易维护,出现问题可以精确定位到。“C”with Class”阶段,C语言基础上的特征主要有:类及派生类、共有和私有成员、构造函数和析构函数、友元、内联函数、赋值运算符的重载,等等。... 编程范式主要有三种:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)。 1、命令式编程(Imperative): 命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。 import random list1=[random.randrange(10) for i in range(5)] result=[] for x in list1: if x>5:result.append(