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