# 成员函数与构造函数

URL: https://caijiao.org/cpp/oop/constructors
Source: docs/cpp/oop/constructors.md
Description: 本节介绍 C++ 中的成员函数与构造函数，讲解成员函数的定义与使用，以及构造函数在类初始化过程中的重要作用，帮助理解类的行为与生命周期。

在 C++ 中，成员函数是类的一部分，负责对类的成员变量进行操作。构造函数是类中的特殊函数，主要用于在对象创建时进行初始化操作。理解成员函数与构造函数是深入掌握面向对象编程的关键。

## 成员函数

成员函数是与类的对象相关联的函数，它可以访问和操作类中的成员变量。成员函数通常用于定义类的行为，并能通过对象调用。

### 示例：定义成员函数

```cpp
#include <iostream>
using namespace std;

class Person {
public:
    string name;
    int age;

    // 成员函数
    void setName(string n) {
        name = n;
    }

    void setAge(int a) {
        age = a;
    }

    void introduce() {
        cout << "Hello, my name is " << name << " and I am " << age << " years old." << endl;
    }
};

int main() {
    Person person1;

    // 调用成员函数设置属性
    person1.setName("Alice");
    person1.setAge(25);

    // 调用成员函数执行行为
    person1.introduce();

    return 0;
}
````

### 输出：

```
Hello, my name is Alice and I am 25 years old.
```

在此示例中，`Person` 类的成员函数 `setName` 和 `setAge` 用于设置成员变量 `name` 和 `age`，而 `introduce` 函数则用于输出个人信息。成员函数通过对象调用，操作对象的状态。

## 构造函数

构造函数是类中的一种特殊成员函数，在对象创建时自动调用，用于初始化对象的状态。构造函数没有返回类型，而且其名字与类名相同。构造函数可以带参数，也可以没有参数。

### 示例：定义构造函数

```cpp
#include <iostream>
using namespace std;

class Person {
public:
    string name;
    int age;

    // 构造函数
    Person(string n, int a) {
        name = n;
        age = a;
    }

    void introduce() {
        cout << "Hello, my name is " << name << " and I am " << age << " years old." << endl;
    }
};

int main() {
    // 创建对象时调用构造函数
    Person person1("Alice", 25);
    person1.introduce();

    return 0;
}
```

### 输出：

```
Hello, my name is Alice and I am 25 years old.
```

在此示例中，`Person` 类定义了一个带有参数的构造函数，用于初始化 `name` 和 `age`。当创建对象时，构造函数会自动被调用，以初始化对象的成员变量。

## 构造函数的默认参数

构造函数可以使用默认参数，这样在创建对象时可以选择是否提供参数。如果没有提供参数，构造函数将使用默认值。

### 示例：带有默认参数的构造函数

```cpp
#include <iostream>
using namespace std;

class Person {
public:
    string name;
    int age;

    // 构造函数，带有默认参数
    Person(string n = "Unknown", int a = 0) {
        name = n;
        age = a;
    }

    void introduce() {
        cout << "Hello, my name is " << name << " and I am " << age << " years old." << endl;
    }
};

int main() {
    // 使用默认参数创建对象
    Person person1;
    person1.introduce();

    // 传递参数创建对象
    Person person2("Bob", 30);
    person2.introduce();

    return 0;
}
```

### 输出：

```
Hello, my name is Unknown and I am 0 years old.
Hello, my name is Bob and I am 30 years old.
```

在这个示例中，`Person` 类的构造函数定义了默认参数 `n` 和 `a`。当创建 `person1` 时，没有传递参数，因此使用默认值。`person2` 通过传递参数来初始化对象。

## 构造函数的初始化列表

在 C++ 中，构造函数可以使用初始化列表来初始化成员变量。初始化列表的语法在构造函数的参数列表后面，以冒号开始，并依次列出需要初始化的成员。

### 示例：使用初始化列表

```cpp
#include <iostream>
using namespace std;

class Person {
public:
    string name;
    int age;

    // 构造函数使用初始化列表
    Person(string n, int a) : name(n), age(a) {}

    void introduce() {
        cout << "Hello, my name is " << name << " and I am " << age << " years old." << endl;
    }
};

int main() {
    // 创建对象时使用初始化列表
    Person person1("Alice", 25);
    person1.introduce();

    return 0;
}
```

### 输出：

```
Hello, my name is Alice and I am 25 years old.
```

在此示例中，构造函数使用初始化列表将 `name` 和 `age` 初始化为传入的参数。这种方式比在构造函数体内赋值更高效，特别是对于常量或引用类型的成员变量。

## 小结

* 成员函数是类的一部分，用于定义类的行为，可以访问和修改类的成员变量。
* 构造函数是特殊的成员函数，在对象创建时自动调用，用于初始化对象的状态。构造函数可以带有或不带有参数。
* 可以通过默认参数和初始化列表来优化构造函数的写法，提供更灵活的对象创建方式。

理解成员函数与构造函数是掌握 C++ 面向对象编程的基础，为构建复杂的类和对象打下坚实的基础。
