📜  编译器何时在C++中创建默认值并复制构造函数?(1)

📅  最后修改于: 2023-12-03 15:41:19.860000             🧑  作者: Mango

编译器何时在C++中创建默认值并复制构造函数?

在C++中,当我们定义一个类的时候,有一些函数会在编译时自动为我们生成。其中包括默认构造函数、复制构造函数、赋值运算符重载函数、析构函数等等。

默认构造函数

默认构造函数是定义在类内部的、没有参数的构造函数。当我们创建一个该类的对象时,并且没有为其显式提供参数时,编译器会自动调用默认构造函数。

例如:

class MyClass{
public:
    MyClass(); // 默认构造函数
};

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

复制构造函数是定义在类内部的、以该类对象作为参数的构造函数。当我们以某个对象为模板创建新的对象时,或者把某个对象作为参数传递给函数时,编译器会自动调用复制构造函数。

例如:

class MyClass{
public:
    MyClass(const MyClass& other); // 复制构造函数
};

void someFunction(MyClass obj){
    // ...
}

int main(){
    MyClass obj1;
    MyClass obj2(obj1); // 自动调用复制构造函数
    someFunction(obj1); // 自动调用复制构造函数
    return 0;
}

需要注意的是,如果我们没有定义复制构造函数,编译器会为我们生成一个默认的复制构造函数(也称为浅复制构造函数)。该函数只是对非静态成员变量进行简单的位拷贝,因此如果该类有指针成员变量,可能会导致多个对象指向同一个内存地址,出现意外的错误。

何时自定义默认构造函数和复制构造函数

通常情况下,我们只需要使用默认生成的默认构造函数和复制构造函数。但是,如果我们的类需要进行一些自定义的操作,例如对某个成员变量进行初始化等,就需要自定义默认构造函数。

例如:

class MyClass{
public:
    MyClass(); // 自定义默认构造函数
private:
    int num;
};

MyClass::MyClass(){
    num = 0; // 对num进行初始化
}

int main(){
    MyClass obj; // 自动调用我们自定义的默认构造函数
    return 0;
}

同理,如果我们的类含有指针成员变量,就需要自定义复制构造函数,以确保每个对象都有独立的内存空间。

例如:

class MyClass{
public:
    MyClass(const MyClass& other); // 自定义复制构造函数
private:
    int* data;
};

MyClass::MyClass(const MyClass& other){
    data = new int(*other.data); // 对data进行深拷贝
}

int main(){
    MyClass obj1;
    MyClass obj2(obj1); // 自动调用我们自定义的复制构造函数
    return 0;
}

总之,在定义类时,我们需要注意是否需要自定义默认构造函数和复制构造函数。如果是,需要确保该函数正确实现了对成员变量的初始化或深拷贝操作。