Memulakan Tatasusunan Objek Tanpa Pembina Lalai
Tatasusunan objek biasanya digunakan dalam pengaturcaraan, tetapi isu mungkin timbul apabila memulakannya dengan kelas yang tidak mempunyai pembina lalai . Pertimbangkan kod berikut:
class Car { private: Car(){}; // Private default constructor int _no; public: Car(int no) { _no = no; } };
Dalam kelas ini, pembina lalai (Kereta()) adalah peribadi, yang bermaksud objek jenis Kereta tidak boleh dibuat tanpa memberikan hujah. Walau bagaimanapun, apabila memulakan tatasusunan objek Kereta, pengkompil cuba memanggil pembina lalai untuk setiap elemen, yang membawa kepada ralat:
cartest.cpp:5: error: ‘Car::Car()’ is private cartest.cpp:21: error: within this context
Penyelesaian Menggunakan Peletakan-Baharu
Untuk mengatasi masalah ini, penempatan-baru boleh digunakan. Placement-new membolehkan kami memperuntukkan memori dan membina objek secara langsung di lokasi memori tersebut tanpa menggunakan pembina objek. Begini cara ia boleh dilaksanakan:
int main() { void *raw_memory = operator new[](NUM_CARS * sizeof(Car)); // Allocate raw memory Car *ptr = static_cast<Car *>(raw_memory); // Cast to a pointer to Car for (int i = 0; i < NUM_CARS; ++i) { new(&ptr[i]) Car(i); // Call placement-new to construct Car objects in-place } }
Dengan menggunakan penempatan-baru, kita boleh memulakan tatasusunan objek tanpa memanggil pembina lalai secara eksplisit. Objek dicipta dan diletakkan terus ke dalam memori yang diperuntukkan.
Kelebihan Mengelakkan Pembina Lalai
Seperti yang dinyatakan dalam Item 4 "C Lebih Berkesan" Scott Meyers, mengelakkan pembina lalai yang tidak sepatutnya boleh meningkatkan ketepatan dan kebolehselenggaraan program. Pembina lalai sering membawa kepada kekaburan dalam reka bentuk kelas dan boleh menjadikannya mencabar untuk menguatkuasakan invarian kelas. Dengan mentakrifkan pembina secara eksplisit, pengaturcara menegaskan bahawa objek kelas itu hanya boleh dibuat dengan set argumen tertentu, memastikan kawalan dan kejelasan yang lebih baik.
Atas ialah kandungan terperinci Bagaimana untuk Memulakan Tatasusunan Objek Tanpa Pembina Lalai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!