千家信息网

Java复制构造函数实例分析

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇"Java复制构造函数实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Ja
千家信息网最后更新 2025年02月01日Java复制构造函数实例分析

这篇"Java复制构造函数实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Java复制构造函数实例分析"文章吧。

题目:以下整型数组类的定义中每个函数有且只有一处错误,找出并改正

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复制构造函数实例分析"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

0