Rumah > Java > javaTutorial > teks badan

Penjelasan terperinci tentang contoh pembina salinan dalam Java

WBOY
Lepaskan: 2023-04-23 22:58:05
ke hadapan
1546 orang telah melayarinya

Tajuk: Hanya terdapat satu ralat dalam setiap fungsi dalam takrifan kelas tatasusunan integer berikut. Cari dan betulkan

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;
};
Salin selepas log masuk

Analisis: . Ralat di atas adalah semua pengetahuan yang paling asas dalam C++ dan juga merupakan bahagian yang paling mengelirukan Satu perkara yang perlu diberi perhatian tentang pembina salinan ialah isu salinan dalam dan salinan cetek. Setiap masalah fungsi di atas diterangkan seperti berikut:

1 Tugasan bermula tanpa memperuntukkan ruang di dalam pembina

2 Pembina salinan adalah salinan cetek, menyebabkan kedua-dua objek menjadi berkongsi sekeping. Memori

3. Memori tatasusunan harus dipadamkan di dalam pemusnah, dan penunjuk harus diberikan kosong

4 tidak lengkap, apabila indeks ialah nilai negatif , program ranap

5 Fungsi pengendali tugasan tidak mempunyai nilai pulangan digunakan untuk menetapkan secara berterusan a = b = c;

Atur cara diperbetulkan seperti berikut:

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;
};
Salin selepas log masuk

Nota: Dalam pembina salinan, tidak boleh cuba memanggil pembina untuk melaksanakan salinan dalam Sebabnya adalah tanpa nama objek akan dijana dalam pembina, dan pembina salinan dipanggil Selepas itu, objek itu dimusnahkan (anda boleh mengesahkannya dengan mencetak aksara dalam pemusnah), jadi penyalinan dalam tidak dilaksanakan seperti yang diharapkan, dan objek tanpa nama disalin secara mendalam. . Oleh itu, apabila secara luaran mengakses ahli data objek yang memanggil pembina salinan, ralat akan dilaporkan.

Fungsi ujian adalah seperti berikut:

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

}
Salin selepas log masuk

Atas ialah kandungan terperinci Penjelasan terperinci tentang contoh pembina salinan dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan