实现数组类(C++ 拷贝构造函数、拷贝函数)要判断赋值左右对象不相等,坑惨了

#include <iostream>
using namespace std;
class ArrayIndexOutOfBoundsException{  // 异常类
public:
    int index;
    ArrayIndexOutOfBoundsException(int k){
        index = k;
    }
};
class Array{
private:
    int *data;
    int size;
    static const int dSize = 10;   // 数组默认大小
public:
    Array( ){  // 无参构造
        size = dSize;
        data = new int[size]( );
    }
    
        Array(int n ){  // 有参构造
        size = n;
        data = new int[size]( );
    }
    
    Array(const Array& arr)//拷贝构造函数,深拷贝
    {
    if(arr.size>0)    
 	{ 

		size = arr.size;
        data = new int[size]( );
        for (int i = 0; i < size; i++)
        {
            data[i] = arr.data[i];
        }
    }
  }
	
	Array& operator = (const Array& arr)
	{
		if(this!=&arr)//如果等号右侧的对象和左边的不是一个对象再赋值(没有这句会运行error),要判断赋值左右对象不相等,坑惨了 
		{
		delete []data;//先释放掉之前的内存,否则会内存超限	
	    size = arr.size;
        data = new int[size]( );
        for (int i = 0; i < size; i++)
        {
            this->data[i] = arr.data[i];
        }
    	}
		
		return *this;
	}
    
    ~Array() 
    {
        if (this->data != NULL)//不为空才释放 
        {
            delete []data;
        }
       
    }
				
		
    int& operator [] (int k){     // 运算符 [ ] 重载,以方便数组的使用
        if(k<0 || k>=size) throw ArrayIndexOutOfBoundsException(k);
        return data[k];
    }
    friend ostream& operator << (ostream& o, const Array& a);   // 运算符 << 重载,以方便输出
};
ostream& operator << (ostream& o, const Array& a){
    o << '[' ;
    for(int i=0; i<a.size-1; i++)
        o << a.data[i] << ',' ;
    o << a.data[a.size-1] << ']';
    return o;
}
// 注意:实际测试程序中,在此处之前的代码与样例中相同
// 注意:实际测试程序中,在此处之后的代码(即main函数)可能与样例中不同
int main(){
    int n, k;
    cin >> n >> k;
    Array a(n);  // 构造数组,大小为 n
    for(int i=0; i<n; i++) a[i] = i;
    Array b = a;  // 拷贝构造数组
    b[n/2] = k;
    cout << a << endl;
    cout << b << endl;
    Array c;  // 构造数组,默认大小
    c = a; // 拷贝数组
    c[n/2] = k;
    cout << a << endl;
    cout << c << endl;
    a = a;
    a[n/2] = 2223;
    cout << a << endl;
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/cstdio1/p/11080172.html
今日推荐