Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der Beispiele für Kopierkonstruktoren in Java

Detaillierte Erläuterung der Beispiele für Kopierkonstruktoren in Java

WBOY
WBOYnach vorne
2023-04-23 22:58:051539Durchsuche

Frage: In jeder Funktion in der Definition der folgenden Integer-Array-Klasse gibt es nur einen Fehler. Finden und korrigieren Sie ihn.

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;
};

Analyse: Die oben genannten Fehler sind die grundlegendsten Kenntnisse in C++ und auch die verwirrendsten Bei Kopierkonstruktoren ist das Problem der tiefen Kopie und der flachen Kopie zu beachten. Jedes Problem der oben genannten Funktionen wird wie folgt beschrieben:

1. Die Zuweisung beginnt, ohne Platz im Konstruktor zuzuweisen.

2 Der Kopierkonstruktor ist eine flache Kopie, wodurch sich die beiden Objekte einen Destruktor teilen Der Array-Speicher sollte intern gelöscht werden und der Zeiger sollte leer sein. Die Zuweisungsoperatorfunktion hat keinen Rückgabewert und gibt zurück. Die Funktion des Werts besteht darin, a = b = c kontinuierlich zuzuweisen. Die Programmkorrektur lautet wie folgt:

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;
};

Erklärung:

Im Kopierkonstruktor ist dies nicht möglich Versuchen Sie, den Konstruktor aufzurufen, um eine tiefe Kopie zu implementieren, da dadurch ein anonymes Objekt im Konstruktor generiert wird. Nachdem der Kopierkonstruktor aufgerufen wurde, wird das Objekt zerstört (Sie können dies überprüfen, indem Sie Zeichen im Destruktor ausgeben), also eine tiefe Kopie und Anonymität werden nicht wie gedacht implementiert. Das Objekt implementiert Deep Copy. Daher wird beim externen Zugriff auf die Datenelemente des Objekts, das den Kopierkonstruktor aufruft, ein Fehler gemeldet.

Die Testfunktion ist wie folgt:

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]);

}

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Beispiele für Kopierkonstruktoren in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen