题目:以下整型数组类的定义中每个函数有且只有一处错误,找出并改正
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、析构函数内部应删除数组内存,并将指针赋值为空
立即学习“Java免费学习笔记(深入)”;
4、中括号操作符函数下标越界检验不完全,当index为负值时,程序崩溃
PHP网络编程技术详解由浅入深,全面、系统地介绍了PHP开发技术,并提供了大量实例,供读者实战演练。另外,笔者专门为本书录制了相应的配套教学视频,以帮助读者更好地学习本书内容。这些视频和书中的实例源代码一起收录于配书光盘中。本书共分4篇。第1篇是PHP准备篇,介绍了PHP的优势、开发环境及安装;第2篇是PHP基础篇,介绍了PHP中的常量与变量、运算符与表达式、流程控制以及函数;第3篇是进阶篇,介绍
386
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中的复制构造函数实例详解的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号