C 11의 클래스 내 초기화: 비정적 및 비상수 멤버에 대한 제한 완화
C 11 이전, 클래스 내 초기화 정적 const 정수 또는 열거형 멤버로 제한되었습니다. 이러한 제한의 이유는 복잡한 링커 규칙을 피하면서 여러 번역 단위에서 개체에 대한 고유한 정의를 유지해야 하기 때문입니다.
그러나 C 11은 이러한 제한을 완화하여 비정적 멤버의 클래스 내 초기화를 허용합니다(§ 12.6.2/8). 여기에는 중괄호 또는 동등 초기화 프로그램이 있는 비정적 데이터 멤버와 비추상 클래스의 비가상 기본 클래스가 포함됩니다.
이를 가능하게 하기 위해 무엇이 변경되었나요? 링커에 대한 중요한 수정은 없었지만 컴파일러는 추가 책임을 처리하기 위해 더욱 복잡해졌습니다.
여러 정의에 엄격한 규칙을 적용했던 이전 버전의 C와 달리 C 11의 컴파일러는 이제 링커 내에서 여러 정의를 처리합니다. 수업. 정의 충돌을 해결하는 링커 대신 컴파일러가 이 작업을 맡습니다.
이러한 책임 변경으로 인해 이제 단일 멤버에 대한 여러 멤버 초기화 간의 잠재적인 충돌을 고려해야 하는 프로그래머에게 더 많은 복잡성이 발생합니다. 예를 들어, 멤버 이니셜라이저와 동일한 멤버에 대한 특정 초기화가 포함된 생성자가 모두 있는 클래스에서는 어떤 초기화를 사용할지 결정하기 위해 신중한 고려가 필요합니다.
복잡성이 증가함에도 불구하고 클래스 내 초기화의 이점은 다음과 같습니다. 도전보다 더 중요합니다. 더 간결하고 표현력이 풍부한 코드를 가능하게 하여 상용구를 줄이고 코드를 더 쉽게 읽고 이해할 수 있게 해줍니다.
위 내용은 C 11은 어떻게 비정적 및 비상수 멤버의 클래스 내 초기화를 허용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!