题目:以下整型数组类的定义中每个函数有且只有一处错误,找出并改正
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中的复制构造函数实例详解的详细内容。