역사적 맥락:
이전 C++ 버전에서는 모든 클래스 멤버가 생성자의 초기화 목록이나 생성자 본문에서 초기화되어야 했습니다. C++11의 등장으로 클래스의 비정적 멤버를 정의하는 장소에서 직접 초기화할 수 있게 되었으며, 이는 가독성을 크게 향상시키고 초기화되지 않은 변수로 인한 오류 가능성을 줄였습니다.
문제:
기본값 초기화의 부재는 특히 새로운 생성자가 추가될 때 개발자에게 명확하지 않은 동작을 초래했습니다. 클래스 멤버가 항상 초기화된다는 보장이 없었습니다. 접근 방식의 아름다움과 새로움은 boilerplate 코드를 줄이는 데 있습니다.
해결책:
인라인 초기화는 생성자 초기화 목록에서 명시적으로 초기화되지 않은 경우 클래스 멤버에 대한 기본값을 설정합니다.
코드 예시:
class Widget { int value = 42; std::string name{"default"}; public: Widget() {} Widget(int v) : value(v) {} };
주요 특징:
생성자 초기화 목록에 클래스 멤버가 있으면 인라인 초기화의 값이 사용됩니까?
아니요, 생성자 초기화 목록에서의 값이 사용됩니다. 예:
class Test { int a = 10; public: Test(int x) : a(x) {} }; Test t(42); // a == 42
정적 클래스 멤버를 인라인으로 초기화할 수 있습니까?
아니요, 오직 비정적만 가능합니다. 정적 클래스 멤버는 클래스 외부에서 별도로 초기화됩니다.
인라인으로 클래스 멤버를 초기화하기 위해 표현식을 사용할 수 있습니까?
단순 멤버의 경우 예, (예: 생성자 호출이나 리터럴). 복잡한 계산에는 함수나 생성자 내 초기화를 사용하세요.
팀이 새로운 생성자를 추가했지만 필드를 초기화하는 것을 잊었습니다. 필드는 초기화되지 않은 값으로 남아 있었고 변수에 접근할 때 크래시가 발생했습니다.
장점:
단점:
모든 클래스 필드에 대해 인라인 초기화가 적용되었습니다. 새로운 생성자에서 초기화를 명시적으로 작성할 필요가 없어졌고, boilerplate 코드와 오류의 수가 줄어들었습니다.
장점:
단점: