📅  最后修改于: 2023-12-03 15:41:19.860000             🧑  作者: Mango
在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;
}
总之,在定义类时,我们需要注意是否需要自定义默认构造函数和复制构造函数。如果是,需要确保该函数正确实现了对成员变量的初始化或深拷贝操作。