# C++ 中的 OOP 概念

> 原文： [https://beginnersbook.com/2017/08/cpp-oops-concepts/](https://beginnersbook.com/2017/08/cpp-oops-concepts/)

面向对象编程是一种通过使用对象将问题分解为更小问题来解决复杂问题的方法。在面向对象编程（通常称为 OOP）之前，程序是用过程语言编写的，它们只是一长串指令。另一方面，OOP 就是创建可以交互的对象，这使得在 OOP 中开发程序变得更容易，因为我们可以理解它们之间的关系。

## 面向对象编程（OOP）

在面向对象编程中，我们使用类和对象编写程序，利用 OOP 的特征，如**抽象**，**封装**，**继承**和**多态**。

### 类和对象

类就像数据成员和函数的蓝图，对象是类的实例。例如，假设我们有一个类 **`Car`** ，它有数据成员（变量），如`speed`，`weight`，`price`，和函数，如`gearChange()`，`slowDown()`，`brake()`等。现在让我们说我创建了一个名为`FordFigo`的类的对象，它使用这些数据成员和函数，并为它们提供自己的值。同样，我们可以使用蓝图（类）创建任意数量的对象。

```cpp
//Class name is Car
class Car
{
    //Data members
    char name[20];
    int speed;
    int weight;

public:
    //Functions
    void brake(){
    }
    void slowDown(){
    }
};

int main()
{
   //ford is an object
   Car ford; 
}
```

### 抽象

[抽象](https://beginnersbook.com/2017/09/abstraction-in-c-with-example/)是隐藏用户不相关细节的过程。例如，当您发送短信时，您只需键入消息，选择联系人并单击发送，手机会显示消息已发送，单击发送时背景中实际发生的情况对您是隐藏的，因为它对你不相关。

### 封装

[封装](https://beginnersbook.com/2017/09/cpp-encapsulation/)是将数据和函数组合成像胶囊这样的单个单元的过程。这是为了避免从类外部访问私有数据成员。为了实现封装，我们将类的所有数据成员设为私有并创建公共函数，使用它们我们可以从这些数据成员获取值或为这些数据成员设置值。

### 继承

[继承](https://beginnersbook.com/2017/08/cpp-inheritance/)是一个特性，子类的对象使用该特性获取父类的属性。

```cpp
#include <iostream>
using namespace std;
class ParentClass {
  //data member
  public:
    int var1 =100;
};
class ChildClass: public ParentClass {
  public:
  int var2 = 500;
};
int main(void) {
  ChildClass obj;
}
```

现在这个对象`obj`可以使用`ParentClass`的属性（例如变量`var1`）。

### 多态

[函数重载](https://beginnersbook.com/2017/08/cpp-function-overloading/)和运算符重载是多态的例子。多态是一种在不同情况下对象表现不同的特性。

在函数重载中，我们可以有多个函数，具有相同名称但不同数量，类型或顺序的参数。

#### 多态实例

```cpp
#include <iostream>
using namespace std;
class Sum {
  public:
    int add(int num1,int num2){
      return num1 + num2;
    }
    int add(int num1, int num2, int num3){
      return num1 + num2 + num3;
    }
};
int main(void) {
   //Object of class Sum
   Sum obj;

   //This will call the second add function
   cout<<obj.add(10, 20, 30)<<endl;

   //This will call the first add function
   cout<<obj.add(11, 22);
   return 0;
}
```

**输出：**

```cpp
60
33
```