기본 생성자 없이 객체 배열 초기화
객체 배열은 프로그래밍에서 일반적으로 사용되지만 기본 생성자가 없는 클래스로 초기화할 때 문제가 발생할 수 있습니다. . 다음 코드를 고려하세요.
class Car { private: Car(){}; // Private default constructor int _no; public: Car(int no) { _no = no; } };
이 클래스 내에서 기본 생성자(Car())는 비공개입니다. 즉, 인수를 제공하지 않으면 Car 유형의 객체를 만들 수 없습니다. 그러나 Car 객체의 배열을 초기화할 때 컴파일러는 각 요소에 대한 기본 생성자를 호출하려고 시도하여 오류가 발생합니다.
cartest.cpp:5: error: ‘Car::Car()’ is private cartest.cpp:21: error: within this context
Placement-New를 사용한 솔루션
이 문제를 극복하기 위해 배치 신규를 사용할 수 있습니다. Placement-new를 사용하면 객체 생성자를 호출하지 않고도 해당 메모리 위치에 직접 메모리를 할당하고 객체를 생성할 수 있습니다. 구현 방법은 다음과 같습니다.
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 } }
placement-new를 사용하면 기본 생성자를 명시적으로 호출하지 않고도 객체 배열을 초기화할 수 있습니다. 객체는 생성되어 할당된 메모리에 직접 배치됩니다.
기본 생성자를 피할 때의 이점
Scott Meyers의 "More Effective C" 항목 4에서 언급했듯이, 불필요한 기본 생성자를 피하면 프로그램 정확성과 유지 관리 가능성이 향상될 수 있습니다. 기본 생성자는 종종 클래스 디자인에서 모호성을 초래하고 클래스 불변성을 적용하기 어렵게 만들 수 있습니다. 프로그래머는 생성자를 명시적으로 정의함으로써 해당 클래스의 객체가 특정 인수 집합을 통해서만 생성될 수 있다고 주장하여 더 큰 제어와 명확성을 보장합니다.
위 내용은 기본 생성자 없이 객체 배열을 초기화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!