C++基础之深拷贝浅拷贝

1、拷贝构造

当一个已构造了的对象要构造新的对象时,拷贝构造函数被调用。也就是对象需要拷贝时,拷贝构造函数就被调用。如一下几个情况:
1)对象以值传递方式传入函数体。
2)对象以值传递方式从函数体返回。
3)新对象要通过一个已构造完成的对象进行构造。
在C++里面都有一个默认的拷贝构造函数。默认的拷贝构造函数是浅拷贝,一般无法满足实际的需求。

2、浅拷贝和深拷贝

浅拷贝:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源没有重新分配则为浅拷贝。
深拷贝:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源没有重新分配则为浅拷贝。像指针类型的成员变量,此时应该使用深拷贝;例如A和B含有指针变量,A=B发生了浅拷贝,两者的指针指向了同一块区域。若A调用析构函数,而B变量还在使用;此时这块内存已经被释放了,若B再去使用则会出现野指针错误。因此拷贝时,新对象应该再次向系统申请一块内存空间,故而需要深拷贝。
下面是深拷贝的一个例子:

#include <iostream>
using namespace std;

class A
{
public:

    A() //默认无参数构造函数
    {
        cout << "I am Construction1." << endl;  
        data = new int;
        *data = 0;
    }

    A(int *_data)   //带参数的构造函数
    {
        cout << "I am Constructor1." << endl;
        data = new int;
        *data = *_data;
    }

    A(const A& a)   //拷贝构造函数
    {   
        cout << "I am Copy Constructor2." << endl;
        data = new int;
        *data   = *(a.data);
    }

    A& operator = (const A &a)  //运算符重载
    {
        cout << "I am Operator = !" << endl;
        cout << "C~~~~~" << endl;
        if(&a == this){cout << "SameObj!" << endl; return *this; }
        data  = new int;
        *data = *(a.data);
        return *this;   
    }

    ~A()   //析构函数
    {
        cout << "I am Destructor" << endl;
        if(data != NULL)
        {
            delete data;
        }   
    }

    void print()
    {
        cout << "\tdata: " << *data << endl;
    }

private:
    int *data;  //指针变量。
};


int main()
{
    A z;        //调用默认构造函数
    z.print();
    int x = 100;
    A a(&x);    //调用带参数的构造函数
    a.print();
    A b = a;    //调用了拷贝构造函数(属于深拷贝)
    b.print();
    z = b;      //调用=重载运算符
    z.print();
    return 0;
}
设计并实现一个动态整型数组类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、付费专栏及课程。

余额充值