# C++ 中的构造函数

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

构造函数是初始化类对象的类的特殊成员函数。构造函数名称与类名称相同，并且没有返回类型。让我们举一个简单的例子来理解构造函数的工作原理。

## 简单示例：如何在 C++ 中使用构造函数

阅读以下程序中的注释，以了解该程序的每个部分。

```cpp
#include <iostream>
using namespace std;
class constructorDemo{
public:
   int num;
   char ch;
   /* This is a default constructor of the
    * class, do note that it's name is same as
    * class name and it doesn't have return type.
    */
   constructorDemo() {
      num = 100; ch = 'A';
   }
};
int main(){
   /* This is how we create the object of class,
    * I have given the object name as obj, you can
    * give any name, just remember the syntax:
    * class_name object_name;
    */
   constructorDemo obj;

   /* This is how we access data members using object
    * we are just checking that the value we have
    * initialized in constructor are reflecting or not.
    */
   cout<<"num: "<<obj.num<<endl;
   cout<<"ch: "<<obj.ch;
   return 0;
}
```

**输出：**

```cpp
num: 100
ch: A
```

## 构造函数与成员函数

现在我们知道什么是构造函数，让我们讨论构造函数与类的成员函数的不同之处。

1）构造函数没有返回类型。成员函数具有返回类型。

2）当我们创建类的对象时，会自动调用构造函数。需要使用类的对象显式调用成员函数。

3）当我们不在我们的类中创建任何构造函数时，C++ 编译器生成一个默认构造函数并将其插入到我们的代码中。这同样适用于成员函数。

这是编译器生成的默认构造函数的外观：

```cpp
class XYZ
{ 
    ....
    XYZ()
    {
        //Empty no code
    }
};

```

## C++ 中构造函数的类型

C++ 中有两种类型的构造函数。 1）默认构造函数 2）参数化构造函数

### 1）默认构造函数

默认构造函数没有任何参数（或参数）。

```cpp
#include <iostream>
using namespace std;
class Website{
public:
   //Default constructor
   Website() {
      cout<<"Welcome to BeginnersBook"<<endl;
   }
};
int main(void){
   /*creating two objects of class Website.
    * This means that the default constructor
    * should have been invoked twice.
    */
   Website obj1;
   Website obj2;
   return 0;
}
```

**输出：**

```cpp
Welcome to BeginnersBook
Welcome to BeginnersBook
```

> 如果未在类中指定任何构造函数，则编译器将在代码中插入没有代码（空体）的默认构造函数。

### 2）参数化构造函数

带参数的构造函数称为参数化构造函数。这些类型的构造函数允许我们在创建对象时传递参数。让我们看看他们的样子：

让我们假设类名是`XYZ`。

**默认构造函数：**

```cpp
XYZ() {

}
....
XYZ obj;
....
```

**参数化构造函数：**

```cpp
XYZ(int a, int b) {

}
...
XYZ obj(10, 20);
```

#### 例：

```cpp
#include <iostream>
using namespace std;
class Add{
public:
   //Parameterized constructor
   Add(int num1, int num2) {
     cout<<(num1+num2)<<endl;
   }
};
int main(void){
   /* One way of creating object. Also
    * known as implicit call to the
    * constructor
    */
   Add obj1(10, 20);
   /* Another way of creating object. This
    * is known as explicit calling the
    * constructor.
    */
   Add obj2 = Add(50, 60);
   return 0;
}
```

**输出：**

```cpp
30
110
```