C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造


在 C++ 中,构造函数是用于初始化对象的特殊成员函数,它们在对象创建时自动调用。构造函数可以分为默认构造函数、带参数构造函数、拷贝构造函数和移动构造函数。下面让我们逐个进行实战指南。

默认构造函数(Default Constructor)

默认构造函数没有参数,用于创建对象时执行必要的初始化操作。

#include <iostream>

class MyClass {
public:
    MyClass() {
        std::cout << "Default Constructor called" << std::endl;
    }
};

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

带参数构造函数(Parameterized Constructor)

带参数构造函数接受参数,并用参数初始化对象的成员变量。

#include <iostream>

class MyClass {
public:
    int value;
    MyClass(int val) : value(val) {
        std::cout << "Parameterized Constructor called with value: " << val << std::endl;
    }
};

int main() {
    MyClass obj(10);  // 调用带参数构造函数
    std::cout << "Value: " << obj.value << std::endl;
    return 0;
}

拷贝构造函数(Copy Constructor)

拷贝构造函数用于从一个已有对象创建一个新对象,它将一个对象的数据成员值复制到另一个对象中。

#include <iostream>

class MyClass {
public:
    int value;
    MyClass(int val) : value(val) {}

    // 拷贝构造函数
    MyClass(const MyClass &obj) {
        std::cout << "Copy Constructor called" << std::endl;
        value = obj.value;  // 复制对象的数据成员值
    }
};

int main() {
    MyClass obj1(10);  // 创建对象1
    MyClass obj2 = obj1;  // 使用拷贝构造函数创建对象2
    std::cout << "Value of obj2: " << obj2.value << std::endl;
    return 0;
}

移动构造函数(Move Constructor)

移动构造函数用于将临时对象(右值引用)的资源(如指针)转移给新对象,而不是拷贝。

#include <iostream>

class MyString {
public:
    char *str;
    MyString(char *s) : str(s) {}

    // 移动构造函数
    MyString(MyString &&obj) noexcept : str(obj.str) {
        std::cout << "Move Constructor called" << std::endl;
        obj.str = nullptr;  // 将临时对象的资源转移给新对象
    }
};

int main() {
    char text[] = "Hello";
    MyString obj1(text);  // 创建对象1
    MyString obj2 = std::move(obj1);  // 使用移动构造函数创建对象2
    std::cout << "Value of obj2: " << obj2.str << std::endl;
    std::cout << "Value of obj1: " << (obj1.str ? obj1.str : "nullptr") << std::endl;
    return 0;
}

小结

  • 默认构造函数用于对象的初始化。
  • 带参数构造函数用于接受参数,并初始化对象的成员变量。
  • 拷贝构造函数用于从一个已有对象创建一个新对象,复制对象的数据成员值。
  • 移动构造函数用于将临时对象的资源转移给新对象,提高效率。

合理使用构造函数能够确保对象的正确初始化和资源管理,从而提高程序的健壮性和性能。


原文链接:codingdict.net