构造函数的分类

C++ 构造函数的分类与调用方式详解

在 C++ 中,构造函数(Constructor)是类的特殊成员函数,在对象创建时自动调用,用于对对象进行初始化。根据使用场景和实现方式,构造函数可以分为不同的类型,且调用方式也各有不同。本文将详细介绍 C++ 构造函数的分类及其调用方式。

1.1 默认构造函数(无参构造函数)

定义:
默认构造函数是不带参数的构造函数,在创建对象时会自动调用。如果程序员没有定义任何构造函数,编译器会自动提供一个默认构造函数(但不会初始化成员变量)。

示例代码:

#include 
using namespace std;

class Person {
public:
    // 默认构造函数
    Person() {
        cout << "默认构造函数被调用!" << endl;
    }
};

int main() {
    Person p; // 自动调用默认构造函数
    return 0;
}

输出:

默认构造函数被调用!

特点:

  • 如果类中没有定义任何构造函数,编译器会自动生成默认构造函数。
  • 一旦程序员定义了其他构造函数,编译器不会再提供默认构造函数,需要手动定义。

1.2 有参构造函数

定义:
有参构造函数用于在对象创建时传入参数,以初始化成员变量。

示例代码:

#include 
using namespace std;

class Person {
private:
    string name;
    int age;

public:
    // 有参构造函数
    Person(string pName, int pAge) {
        name = pName;
        age = pAge;
        cout << "有参构造函数被调用!" << endl;
    }

    void show() {
        cout << "姓名: " << name << ", 年龄: " << age << endl;
    }
};

int main() {
    Person p1("张三", 25); // 传递参数,调用有参构造函数
    p1.show();
    return 0;
}

输出:

有参构造函数被调用!
姓名: 张三, 年龄: 25

特点:

  • 可以重载,即同一个类可以有多个不同参数列表的构造函数。
  • 不能再使用无参构造(除非手动提供)。

1.3 拷贝构造函数

定义:
拷贝构造函数用于用一个已存在的对象创建新的对象。默认情况下,编译器会提供一个浅拷贝的拷贝构造函数。

示例代码:

#include 
using namespace std;

class Person {
private:
    string name;
public:
    // 有参构造函数
    Person(string pName) {
        name = pName;
    }

    // 拷贝构造函数
    Person(const Person& other) {
        name = other.name;
        cout << "拷贝构造函数被调用!" << endl;
    }

    void show() {
        cout << "姓名: " << name << endl;
    }
};

int main() {
    Person p1("张三");
    Person p2 = p1;  // 调用拷贝构造函数
    p2.show();
    return 0;
}

输出:

拷贝构造函数被调用!
姓名: 张三

特点:

  • 需要 const & 作为参数,以提高效率。
  • 默认拷贝构造函数进行的是浅拷贝(如果类包含指针成员,可能导致重复释放资源问题)。
  • 如果类涉及动态内存分配,通常需要手动定义深拷贝的拷贝构造函数。

2. 构造函数的调用方式

C++ 构造函数的调用方式可以分为 括号法、显示法、隐式转换法 三类:

2.1 括号法(最常用)

使用括号 () 直接调用构造函数。

Person p1("张三", 25); // 括号法

注意:

  • 不能用于无参构造函数,否则会被解析为函数声明,如:
    Person p1(); // ❌ 这是一个函数声明,而不是对象定义!
    

 
  

2.2 显示法(直接赋值)

  • 使用 = 进行赋值,实际上是调用拷贝构造函数

Person p2 = Person("张三", 25);
Person p3 = p2; // 拷贝构造

2.3 隐式转换法

如果构造函数不是 explicit,可以使用隐式转换。

Person p4 = {"张三", 25}; // 直接赋值方式
Person p5 = 30;  // 如果没有 explicit,会自动调用构造函数

你可能感兴趣的:(c++,开发语言)