C 11의 클래스 내 초기화 확장: 연결 장벽 깨기
C 03에서는 클래스 내 초기화가 정적 const 멤버로 제한되었습니다. 정수 또는 열거 유형. 이 제한은 객체에 대한 고유 정의를 요구하는 링커 규칙 위반에 대한 우려에서 비롯되었습니다.
그러나 C 11은 이러한 제한을 크게 완화하여 비정적 및 비 const 멤버의 클래스 내 초기화를 허용합니다. 이는 연결과 관련된 잠재적인 문제를 어떻게 해결했는지에 대한 의문을 제기합니다.
초기 직관과는 달리 링커의 작업은 크게 변하지 않았습니다. 대신, 컴파일러는 클래스 내 초기화를 처리하는 책임을 맡습니다. 이는 클래스 내에서 초기화된 경우에도 클래스 멤버에 대해 하나의 정의만 생성되도록 보장함으로써 이를 수행합니다.
이 변경으로 인해 컴파일러에 추가적인 복잡성이 발생하지만 프로그래머에게 미치는 영향은 일반적으로 최소화됩니다. . 클래스 멤버에 여러 개의 초기화 프로그램이 있는 경우 한 가지 주의 사항이 발생합니다. 이러한 경우 컴파일러는 사용된 특정 생성자를 기반으로 어떤 초기화 프로그램이 우선적으로 적용되는지 결정합니다.
예를 들어 다음 클래스를 고려하세요.
class X { int a = 1234; public: X() = default; X(int z) : a(z) {} };
기본 생성자를 사용하여 객체를 생성하는 경우, 'a' 값은 1234로 초기화됩니다. 그러나 'a' 값을 명시적으로 지정하는 생성자가 사용되는 경우 클래스 내 초기화는 다음과 같습니다. 무시됩니다.
X x{5678};
이 경우 'x' 객체의 'a' 값은 5678이 됩니다. 이 동작을 통해 클래스 멤버는 항상 가장 적절한 값으로 초기화됩니다.
전반적으로 C 11의 클래스 내 초기화 기능 확장은 무결성을 손상시키지 않으면서 프로그래머에게 더 큰 유연성과 편의성을 제공합니다. 전반적인 연결 과정.
위 내용은 C 11은 링커 충돌 없이 클래스 내 초기화를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!