在 C++ 中,拷贝构造函数用于创建一个对象的副本,其函数签名通常为 类名(const 类名&)
。当一个对象被复制给另一个对象时,或者当对象作为函数参数传递给函数时,拷贝构造函数会被调用。
如果你不显式地定义一个拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。这个默认的拷贝构造函数执行的是浅拷贝,即简单地复制对象的每个成员的值。
如果类中包含指针成员,浅拷贝可能会导致问题,因为拷贝构造函数只是复制指针的值,而不是复制指针指向的内容,这可能导致多个对象共享同一块内存,造成潜在的内存管理问题。为了解决这个问题,需要实现自定义的拷贝构造函数来执行深拷贝,即复制指针所指向的内容。
继承类的拷贝构造函数的编写方式与普通类的拷贝构造函数类似。通常情况下,继承类的拷贝构造函数应该调用基类的拷贝构造函数来确保基类部分被正确地复制。
#include <iostream>
#include <cstring>
// 基类
class Base {
private:
int* basePtr;
public:
Base(int val) {
basePtr = new int(val);
}
// 拷贝构造函数
Base(const Base& other) {
basePtr = new int(*other.basePtr);
}
// 析构函数
~Base() {
delete basePtr;
}
void display() {
std::cout << "Base value: " << *basePtr << std::endl;
}
};
// 派生类
class Derived : public Base {
private:
int* derivedPtr;
public:
Derived(int baseVal, int derivedVal) : Base(baseVal) {
derivedPtr = new int(derivedVal);
}
// 拷贝构造函数
Derived(const Derived& other) : Base(other) {
derivedPtr = new int(*other.derivedPtr);
}
~Derived() {
delete derivedPtr;
}
void display() {
Base::display();
std::cout << "Derived value: " << *derivedPtr << std::endl;
}
};
int main() {
Derived obj1(10, 20);
Derived obj2 = obj1; // 调用拷贝构造函数创建 obj2 对象
obj2.display();
return 0;
}