分析Java复制构造函数的实现方式及作用
作者:SunnyJourney
时间:2023-04-24
浏览:1
题目:以下整型数组类的定义中每个函数有且只有一处错误,找出并改正classArrayInt{public:ArrayInt(constint*pArray,intsize):m_nSize(size){assert(size>0);for(inti=0;i
题目:以下整型数组类的定义中每个函数有且只有一处错误,找出并改正
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]);
}
作者最新文章
图几
2026-09-16 17:43
SQL中ROUND函数对0.5的处理机制及强制四舍五入方法
2026-09-15 14:19
JS金额计算怎么避免四舍五入误差
2026-09-14 17:32
韩国8月携号转网数据:Galaxy Z8系列iPhone用户转化率约为Z7系列2倍
2026-09-08 17:02
AE基础教程:如何创建合成并制作关键帧动画
2026-09-04 09:27
上一篇:
java如何判断虚引用
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































