标签:out space ++ let 赋值 程序 pac 大小 深拷贝
#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; }
实现数组类(C++ 拷贝构造函数、拷贝函数)要判断赋值左右对象不相等,坑惨了
标签:out space ++ let 赋值 程序 pac 大小 深拷贝
原文地址:https://www.cnblogs.com/cstdio1/p/11080172.html