C++深浅拷贝的实现

C++中的对象拷贝包括深拷贝和浅拷贝。当对象含有指针成员时,浅拷贝可能导致多个对象共享同一内存,从而引发问题。深拷贝会为每个对象分配独立的内存空间,确保对象独立。文章通过实例展示了深浅拷贝的区别,并演示了正确使用深拷贝的方法,避免了内存重复释放导致的程序崩溃。
摘要由CSDN通过智能技术生成

C++中提供了对象拷贝的功能,在进行拷贝时,如果我们没有特意去写拷贝构造函数,系统会自动为我们生成,但有些时候,比如对象成员中含有指针变量的时候,就需要防止拷贝出的构造函数中的指针变量与我们的模板对象成员变量中的指针指向同一块地址,此时就需要进行深拷贝,深拷贝会将两块内存中的信息进行拷贝,而不仅仅是值的拷贝(浅拷贝)。

浅拷贝会直接将值进行复制:

class One 
{
public:
  One(){a=5;}
  void setA(int _a){a=_a;}
  int getA(){ return a;}
private:
  int a;
};

int main()
{
  One on1;
  One on2=on1;
  cout << on2.getA() << endl;
  return 0;
}

结果是5,这里的a是一个整形变量,系统会自动为它申请空间。


深拷贝:

#include<iostream>
#include<stdlib.h>
using namespace std;

class Array
{
public:
	Array(int count);
	Array(const Array & arr);
	~Array();
	void setCount(int count);
	int getCount();
	void printAddr();
	void printArr();
private:
	int m_iCount;
	int *m_pArr;
};

Array::Array(int count)
{
	m_iCount = count;
	m_pArr &
设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。 设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值