Heim > Java > javaLernprogramm > Hauptteil

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

WBOY
Freigeben: 2023-04-23 22:58:05
nach vorne
1557 Leute haben es durchsucht

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;
};
Nach dem Login kopieren

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;
};
Nach dem Login kopieren

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

}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage