简述拷贝构造函数在哪几种情况下会被调用 ?
参考答案:
拷贝构造函数在以下几种情况下会被调用:
- 对象初始化:当我们用一个已存在的对象去初始化一个新对象时,拷贝构造函数会被调用。例如:
class MyClass {
public:
MyClass(const MyClass& other) {
// 拷贝构造函数的实现
}
};
MyClass obj1;
MyClass obj2 = obj1; // 调用拷贝构造函数
- 对象作为函数参数传递:当对象被作为参数传递给函数时,如果函数形参是值传递,那么拷贝构造函数会被调用。例如:
class MyClass {
public:
MyClass(const MyClass& other) {
// 拷贝构造函数的实现
}
};
void func(MyClass obj) {
// ...
}
MyClass obj1;
func(obj1); // 调用拷贝构造函数
- 对象作为函数返回值:当函数返回对象时,拷贝构造函数会被调用。例如:
class MyClass {
public:
MyClass(const MyClass& other) {
// 拷贝构造函数的实现
}
};
MyClass createObject() {
MyClass obj;
return obj; // 调用拷贝构造函数
}
- 对象用于初始化数组元素:当我们用对象初始化数组元素时,拷贝构造函数会被调用。例如:
class MyClass {
public:
MyClass(const MyClass& other) {
// 拷贝构造函数的实现
}
};
MyClass obj1;
MyClass arr[10] = {obj1, obj1, obj1}; // 每次初始化数组元素都会调用拷贝构造函数
- 对象用于初始化临时对象:在某些情况下,编译器可能会创建临时对象,这些临时对象的初始化可能会调用拷贝构造函数。例如,当使用
std::sort
对自定义类型的容器进行排序时,如果排序算法需要创建临时对象,那么拷贝构造函数可能会被调用。
需要注意的是,拷贝构造函数在默认情况下是由编译器自动生成的,但我们可以根据需要自定义拷贝构造函数。自定义的拷贝构造函数应该在需要时正确地复制源对象的所有成员变量,以避免浅拷贝导致的潜在问题。