C++构造函数

C++ 中,类的构造函数(Constructor) 是一种特殊的成员函数,用于在创建对象时初始化对象的状态。构造函数的名称必须与类名相同,且没有返回类型(包括 void)。构造函数在对象创建时自动调用,确保对象在使用时处于有效的初始状态。

默认构造函数

不接受任何参数。
如果类中没有定义任何构造函数,编译器会自动生成一个默认构造函数。
如果定义了其他构造函数,编译器不会自动生成默认构造函数,除非显式地使用 = default。

class MyClass {
public:
    // 默认构造函数
    MyClass() {
        std::cout << "Default Constructor Called!" << std::endl;
    }
};

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

参数化构造函数

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

class Point {
public:
    int x, y;

    // 参数化构造函数
    Point(int x, int y) : x(x), y(y) {
        std::cout << "Parameterized Constructor Called!" << std::endl;
    }
};

int main() {
    Point p(10, 20); // 调用参数化构造函数
    return 0;
}

拷贝构造函数

接受一个同类型的常量引用参数,用于创建一个新对象并将其初始化为另一个对象的副本。
如果类中没有定义拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。

class MyClass {
public:
    int value;

    // 拷贝构造函数
    MyClass(const MyClass &other) : value(other.value) {
        std::cout << "Copy Constructor Called!" << std::endl;
    }
};

int main() {
    MyClass obj1;
    obj1.value = 42;

    MyClass obj2 = obj1; // 调用拷贝构造函数
    return 0;
}

移动构造函数

接受一个同类型的右值引用参数,用于“窃取”另一个对象的资源(通常在涉及动态内存分配时使用)。

如果类中没有定义移动构造函数,编译器会自动生成一个默认的移动构造函数。

class MyClass {
public:
    int *data;

    // 移动构造函数
    MyClass(MyClass &&other) noexcept : data(other.data) {
        other.data = nullptr; // 将源对象的指针置为空
        std::cout << "Move Constructor Called!" << std::endl;
    }
};

int main() {
    MyClass obj1;
    obj1.data = new int(42);

    MyClass obj2 = std::move(obj1); // 调用移动构造函数
    return 0;
}

委托构造函数

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

class MyClass {
public:
    int value;

    // 委托构造函数
    MyClass() : MyClass(0) { // 委托给另一个构造函数
        std::cout << "Delegating Constructor Called!" << std::endl;
    }

    // 参数化构造函数
    MyClass(int value) : value(value) {
        std::cout << "Parameterized Constructor Called!" << std::endl;
    }
};

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

显式构造函数

使用 explicit 关键字修饰构造函数,防止隐式类型转换。

class MyClass {
public:
    int value;

    // 显式构造函数
    explicit MyClass(int value) : value(value) {
        std::cout << "Explicit Constructor Called!" << std::endl;
    }
};

int main() {
    // MyClass obj = 42; // 错误:不能隐式转换
    MyClass obj(42); // 正确:显式调用构造函数
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值