질문: 다음 정수 배열 클래스 정의의 각 함수에는 단 하나의 오류가 있습니다. 찾아서 수정하세요.
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. 복사 생성자는 얕은 복사본이므로 두 객체가 소멸자를 공유하게 됩니다. 배열 메모리는 내부적으로 삭제되어야 하며 포인터는 빈
4에 할당되어야 합니다. 괄호 연산자 함수의 첨자 범위 외 검사가 불완전하면 프로그램이 충돌합니다
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!