题目:以下整型数组类的定义中每个函数有且只有一处错误,找出并改正
class arrayint {public:	arrayint(const int *parray, int size) : m_nsize(size) {		assert(size > 0);		for (int i = 0; i < size; ++ i)			m_parray[i] = parray[i];	}	arrayint(const arrayint &icopy):m_nsize(icopy.m_nsize),m_parray(icopy.m_parray){}	~arrayint() {		delete m_parray;	}	int operator[](short index) {		assert(index < m_nsize);		return m_parray[index];	}	const arrayint & operator=(const arrayint & icopy) {		assert(m_nsize >= icopy.m_nsize);		for (int i = 0; i < m_nsize; ++ i)			m_parray[i] = icopy.m_parray[i];	}private:	short m_nsize;	int * m_parray;};
分析:以上错误均为c++中最基础知识,也是最易让人迷惑的一部分,有关复制构造函数要注意的一点是深复制和浅复制的问题。针对以上函数的每一问题描述如下:
1、构造函数内部没有分配空间便开始赋值;
2、复制构造函数为浅复制,造成两个对象会共用一块内存
3、析构函数内部应删除数组内存,并将指针赋值为空
4、中括号操作符函数下标越界检验不完全,当index为负值时,程序崩溃
5、赋值操作符函数无返回值,返回值的作用是为了连续赋值a = b = c;
程序改正如下:
class arrayint {public:	arrayint(const int *parray, int size) : m_nsize(size) {		assert(size > 0);		m_parray = new int[size];		for (int i = 0; i < size; ++ i)			m_parray[i] = parray[i];	}	arrayint(const arrayint & icopy) {		//arrayint(icopy.m_parray, icopy.m_nsize);		m_nsize = icopy.m_nsize;		assert(m_nsize > 0);		m_parray = new int[m_nsize];		for (int i = 0; i < m_nsize; ++ i)			m_parray[i] = icopy.m_parray[i];	}	~arrayint() {		if (m_parray) {			delete[] m_parray;			m_parray = null;		}		//printf("distructor is called\n");	}	int operator[](short index) {		assert(index < m_nsize && index >= 0);		return m_parray[index];	}	const arrayint & operator=(const arrayint & icopy) {        if (this == &icopy) return *this;		assert(m_nsize >= icopy.m_nsize);		for (int i = 0; i < icopy.m_nsize; ++ i)			m_parray[i] = icopy.m_parray[i];		return *this;	}private:	short m_nsize;	int * m_parray;};
说明:在复制构造函数中,试图调用构造函数来实现深复制的尝试是不可行的,原因是,如此会在构造函数中生成一个匿名对象,复制构造函数调用完毕后,该对象析构(通过在析构函数中打印字符即可验证),所以并没有如想象中的一样实现了深复制,匿名对象是实现了深复制的。所以,在外部访问调用复制构造函数的对象的数据成员时,会报错。
测试函数如下:
void test_construct_copy() {	int parray[] = {1, 2, 3, 5};	arrayint arr(parray, sizeof parray / sizeof(int));	printf(%d \n, arr[2]);	arrayint arr2(arr);	printf(%d \n, arr2[2]);	parray[2] = 8;	arrayint arr3(parray, 4);	printf(%d \n, arr3[2]);	arr3 = arr2;	printf(%d \n, arr3[2]);	parray[2] = 10;	arrayint arr4(parray, 4);	arr3 = arr2 = arr4;	printf(%d \n, arr3[2]);}
以上就是java中的复制构造函数实例详解的详细内容。
   
 
   