42.C++拷贝构造函数以及深拷贝浅拷贝

今天进行了新的学习。

目录

一、拷贝构造函数

二、浅拷贝

三、深拷贝


一、拷贝构造函数

在C++中,拷贝构造函数(Copy Constructor)是一种特殊的构造函数,用于创建一个新对象并将其初始化为与现有对象相同的副本。拷贝构造函数通常用于以下情况:

  1. 当使用一个对象来初始化另一个对象时。

  2. 当将对象作为函数参数按值传递时。

  3. 当从函数返回对象时。

拷贝构造函数的声明和定义如下:

class MyClass {
public:
    // 拷贝构造函数
    MyClass(const MyClass& other) {
        // 在这里进行成员变量的拷贝
        // 可以使用其他构造函数或直接对成员变量进行赋值操作
    }
    // 其他成员函数和成员变量的声明
};

拷贝构造函数的参数是一个常引用(const reference),参数名通常是othersource等表示源对象的名称。在拷贝构造函数内部,你需要根据需要将源对象的成员变量拷贝到新对象中。可以使用其他构造函数或直接对成员变量进行赋值操作。

以下是一个使用拷贝构造函数的示例:

#include <iostream>
using namespace std;
class Myclass {
public:
	int val;

	//
	Myclass(const Myclass& other) {
		this->val = other.val;
		cout << "拷贝构造函数调用成功" << endl;
	}
	//构造函数
	Myclass(int val1) :val(val1){}
};
int main() {
	Myclass obj1(5);
	Myclass obj2(obj1);
	cout << "obj1的值:" << obj1.val << std::endl;
	cout << "obj2的值:" << obj2.val << std::endl;
	return 0;
}

浅拷贝和深拷贝是拷贝构造函数的两种不同实现方式,它们在拷贝对象时处理动态内存分配的方式有所不同: 

二、浅拷贝

浅拷贝(Shallow Copy):

  • 浅拷贝只是简单地将一个对象的数据成员的值复制到另一个对象中,包括指针成员的值。这意味着两个对象的指针成员将指向相同的内存地址。
  • 当一个对象使用浅拷贝构造函数创建另一个对象时,两个对象共享同一块内存区域,这可能会导致两个对象的析构时释放同一块内存,造成悬空指针或内存重复释放的问题。

示例:

#include <iostream>

class ShallowCopy {
public:
    ShallowCopy(int size) {
        data = new int[size];
    }

    // 浅拷贝构造函数
    ShallowCopy(const ShallowCopy& other) {
        data = other.data; // 只是复制指针的值,两个对象共享同一块内存
    }

    ~ShallowCopy() {
        delete[] data;
    }

private:
    int* data;
};

int main() {
    ShallowCopy obj1(5);
    ShallowCopy obj2 = obj1; // 使用浅拷贝构造函数创建obj2

    // 这里会导致错误,因为obj2和obj1共享同一块内存,obj1析构后释放了内存,obj2再次析构时会出错
    return 0;
}

三、深拷贝

深拷贝(Deep Copy):

  • 深拷贝会为新对象分配一块独立的内存,然后将原对象的数据成员的值复制到新对象中,包括指针成员指向的数据也会被复制,确保两个对象的指针成员指向不同的内存地址。
  • 当一个对象使用深拷贝构造函数创建另一个对象时,两个对象是完全独立的,它们的析构时不会出现悬空指针或内存重复释放的问题。

示例:

#include <iostream>

class DeepCopy {
public:
    DeepCopy(int size) {
        data = new int[size];
    }

    // 深拷贝构造函数
    DeepCopy(const DeepCopy& other) {
        data = new int[size];
        for (int i = 0; i < size; i++) {
            data[i] = other.data[i]; // 复制数据到新对象中
        }
    }

    ~DeepCopy() {
        delete[] data;
    }

private:
    int* data;
};

int main() {
    DeepCopy obj1(5);
    DeepCopy obj2 = obj1; // 使用深拷贝构造函数创建obj2

    // 正常析构,obj2的内存是独立分配的
    return 0;
}

 在设计类时,特别是涉及动态内存分配的情况,要谨慎选择使用浅拷贝还是深拷贝,以避免内存管理问题。通常情况下,建议使用深拷贝来确保对象之间的独立性和安全性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清酒。233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值