초기 C++ 버전에서는 클래스 멤버가 생성자 내에서 할당을 통해 초기화되었습니다. 이후 생성자 본문에 들어가기 전에 클래스 멤버를 초기화할 수 있는 초기화 목록의 가능성이 생겼는데, 이것은 상수 멤버, 참조 및 성능에 대해 매우 중요합니다.
일부 클래스 멤버(예: const 필드 또는 참조)는 생성자 본문 내에서 할당으로 초기화할 수 없습니다. 생성 시점에 지정되어야 합니다. 또한, 할당을 사용하면 먼저 기본 생성자가 호출되고 그 다음 할당이 발생하는데(두 단계) 이는 복잡한 객체에 대해서는 비용이 많이 들 수 있습니다:
class Example { const int x; std::string str; public: Example(int val, const std::string& s) : x(val), str(s) {} };
초기화 목록을 사용하여 클래스 멤버를 즉시 초기화하십시오. 이는 특히 const, 참조, 기본 생성자가 없는 멤버 클래스, 그리고 STL 클래스 및 대규모 구조체를 다룰 때 성능에 중요합니다.
코드 예:
class Point { const int x; int& y; public: Point(int val, int& ref) : x(val), y(ref) {} };
주요 특징:
생성자의 초기화 목록에서 멤버의 초기화 순서를 변경할 수 있습니까?
아니요! 멤버는 항상 클래스에서 선언된 순서대로 초기화되며, 초기화 목록의 순서로는 초기화되지 않습니다. 이 규칙을 무시하면 초기화 순서 오류가 발생합니다.
멤버 참조가 초기화 목록에서 초기화되지 않고 생성자 본문에서만 초기화되면 어떻게 됩니까?
컴파일 오류가 발생합니다! 참조는 const 필드와 마찬가지로 초기화 목록에서만 초기화할 수 있으며, 생성자 본문에 들어가기 전에 값을 받아야 합니다.
초기화 목록에서 const 멤버가 초기화된 후 그 값을 생성자 본문에서 변경할 수 있습니까?
아니요, 초기화 후에는 const 멤버를 변경할 수 없으며, 이를 변경하려고 하면 컴파일 오류가 발생합니다.
생성자의 본문 내에서 클래스 멤버가 초기화됩니다. 복잡한 객체에 대해서는 기본 생성자를 호출하고 나서 할당 및 임시 객체 파괴에 자원이 소모됩니다.
장점:
단점:
모든 멤버가 초기화 목록에서 즉시 초기화되며, 불필요한 연산과 불변 필드 문제 없이 문제가 해결됩니다.
장점:
단점: