目录

c中的所有构造函数的方法

c++中的所有构造函数的方法

在 C++ 中,构造函数(Constructor)是一种特殊的成员函数,用于初始化对象。构造函数在创建对象时自动调用,且名称必须与类名相同。以下是 C++ 中所有常见的构造函数类型及其实现方法:


1. 默认构造函数(Default Constructor)

默认构造函数是没有参数的构造函数。如果用户没有定义任何构造函数,编译器会自动生成一个默认构造函数。

语法:
ClassName() {
    // 初始化代码
}

示例:

class MyClass {
public:
    MyClass() {
        cout << "Default Constructor Called!" << endl;
    }
};

int main() {
    MyClass obj; // 调用默认构造函数
    return 0;
}

2. 参数化构造函数(Parameterized Constructor)

参数化构造函数接受一个或多个参数,用于初始化对象的成员变量。

语法:
ClassName(parameters) {
    // 初始化代码
}

示例:

class MyClass {
public:
    int value;
    MyClass(int v) {
        value = v;
        cout << "Parameterized Constructor Called! Value: " << value << endl;
    }
};

int main() {
    MyClass obj(10); // 调用参数化构造函数
    return 0;
}

3. 拷贝构造函数(Copy Constructor)

拷贝构造函数用于通过另一个同类型的对象初始化新对象。它通常以引用方式接受一个同类型的对象作为参数。

语法:
ClassName(const ClassName& other) {
    // 拷贝初始化代码
}

示例:

class MyClass {
public:
    int value;
    MyClass(int v) : value(v) {} // 参数化构造函数
    MyClass(const MyClass& other) {
        value = other.value;
        cout << "Copy Constructor Called! Value: " << value << endl;
    }
};

int main() {
    MyClass obj1(10); // 调用参数化构造函数
    MyClass obj2 = obj1; // 调用拷贝构造函数
    return 0;
}

4. 移动构造函数(Move Constructor)

移动构造函数用于通过“移动”另一个对象的资源来初始化新对象。它通常以右值引用方式接受一个同类型的对象作为参数。

语法:
ClassName(ClassName&& other) {
    // 移动资源代码
}
示例:
class MyClass {
public:
    int* data;
    MyClass(int size) {
        data = new int[size];
        cout << "Parameterized Constructor Called!" << endl;
    }
    MyClass(MyClass&& other) noexcept {
        data = other.data; // 移动资源
        other.data = nullptr; // 置空原对象的指针
        cout << "Move Constructor Called!" << endl;
    }
    ~MyClass() {
        delete[] data;
    }
};

int main() {
    MyClass obj1(10); // 调用参数化构造函数
    MyClass obj2 = std::move(obj1); // 调用移动构造函数
    return 0;
}

5. 委托构造函数(Delegating Constructor)

委托构造函数允许一个构造函数调用同一个类中的另一个构造函数,以避免代码重复。

语法:
ClassName() : ClassName(default_value) {
    // 委托构造函数
}

示例:

class MyClass {
public:
    int value;
    MyClass() : MyClass(0) { // 委托构造函数
        cout << "Delegating Constructor Called!" << endl;
    }
    MyClass(int v) : value(v) { // 参数化构造函数
        cout << "Parameterized Constructor Called! Value: " << value << endl;
    }
};

int main() {
    MyClass obj; // 调用委托构造函数
    return 0;
}

6. 继承中的构造函数(Constructor in Inheritance)

在继承中,派生类的构造函数可以调用基类的构造函数来初始化基类部分。

语法:
DerivedClass() : BaseClass() {
    // 派生类初始化代码
}
示例:
class Base {
public:
    Base() {
        cout << "Base Constructor Called!" << endl;
    }
};

class Derived : public Base {
public:
    Derived() {
        cout << "Derived Constructor Called!" << endl;
    }
};

int main() {
    Derived obj; // 先调用基类构造函数,再调用派生类构造函数
    return 0;
}

7. 初始化列表构造函数(Constructor with Initializer List)

初始化列表构造函数用于在构造函数中直接初始化成员变量,而不是在构造函数体内赋值。

语法:
ClassName() : member1(value1), member2(value2) {
    // 构造函数体
}

示例:

class MyClass {
public:
    int a, b;
    MyClass(int x, int y) : a(x), b(y) { // 使用初始化列表
        cout << "Initializer List Constructor Called! a: " << a << ", b: " << b << endl;
    }
};

int main() {
    MyClass obj(10, 20); // 调用初始化列表构造函数
    return 0;
}

8. 显式构造函数(Explicit Constructor)

显式构造函数用于防止隐式类型转换。通过 explicit 关键字修饰的构造函数只能显式调用。

语法:
explicit ClassName(parameters) {
    // 初始化代码
}

示例:

class MyClass {
public:
    int value;
    explicit MyClass(int v) : value(v) {
        cout << "Explicit Constructor Called! Value: " << value << endl;
    }
};

int main() {
    // MyClass obj = 10; // 错误:不能隐式转换
    MyClass obj(10); // 正确:显式调用构造函数
    return 0;
}

总结

构造函数类型特点
默认构造函数无参数,用于默认初始化
参数化构造函数带参数,用于初始化成员变量
拷贝构造函数通过同类型对象初始化新对象
移动构造函数通过“移动”资源初始化新对象
委托构造函数调用同一个类中的其他构造函数
继承中的构造函数派生类调用基类构造函数
初始化列表构造函数使用初始化列表直接初始化成员变量
显式构造函数防止隐式类型转换