클래스 내에서 상수가 아닌 정적 멤버 및 정적 배열을 초기화하는 데 어려움이 있음
C에서는 클래스 정의 내에서 직접 상수가 아닌 정적 멤버 또는 정적 배열을 초기화하려고 시도합니다. 종종 컴파일러 오류가 발생합니다. 이 문서에서는 이러한 제한 사항의 이유를 조사하고 원하는 기능을 달성하기 위한 해결 방법을 제시합니다.
클래스에서 정적 데이터 멤버를 초기화할 수 없는 이유는 무엇입니까?
C 표준에 따르면 정적 데이터 멤버는 다음을 수행할 수 있습니다. const 정수 또는 열거형 유형인 경우에만 클래스 정의 내에서 초기화됩니다. 이러한 제한은 다음을 보장합니다.
-
고유한 정의: 클래스 정의는 일반적으로 헤더 파일에 포함되며 헤더 파일은 여러 번역 단위에 통합될 수 있습니다. 중복된 개체 정의를 방지하기 위해 C에서는 모든 개체에 고유한 정의가 있어야 합니다. 인메모리 저장이 필요한 객체의 클래스 내 초기화는 이 규칙을 위반하게 됩니다.
정적 const 정수 유형 및 열거형만 허용되는 이유는 무엇입니까? 클래스 내 초기화는 무엇입니까?
- 객체 저장소: 정적 const 정수 멤버는 컴파일 타임 상수로 처리되며 컴파일러에 의해 최적화될 수 있습니다. 클래스 내 초기화를 허용함으로써 컴파일러는 이를 메모리에 저장할 필요가 없으므로 앞서 언급한 제한을 피할 수 있습니다.
-
강제 가능성: 열거형은 클래스 내 초기화가 허용됩니다. 정수 대신 값을 직접 사용할 수 있습니다.
정적 배열은 어떻습니까? class?
정적 배열의 클래스 내 초기화는 const가 아닌 정적 멤버에 적용되는 것과 같은 이유로 금지됩니다. 또한 클래스 내에서 정적 const 배열을 초기화하는 것조차 허용되지 않습니다.
-
불변성이 제한됨: 정적 const 배열은 크기가 아닌 요소에 대해서만 일정합니다. 이는 컴파일러가 이를 컴파일 시간 상수로 처리하여 효율적으로 최적화할 수 없음을 의미합니다.
해결 방법
클래스에서 정적 배열이나 비-상수 멤버를 초기화하려면 다음 기술을 사용할 수 있습니다. 고용됨:
-
열거형 트릭: 정의된 상수와 함께 열거형 사용 배열 크기 및 요소에 대해 설명합니다.
-
클래스 외부 정의: 네임스페이스 범위의 클래스 정의 외부에 정적 변수를 정의하여 const가 아닌 정적 멤버와 정적 배열을 모두 허용합니다. 초기화.
C 11 Evolution
C 11은 초기화를 허용하여 제한을 완화합니다. 클래스 선언 내의 비정적 데이터 멤버 및 상수 표현식을 사용한 정적 const 리터럴 멤버의 초기화. 그러나 이러한 기능은 아직 모든 컴파일러에서 지원되지 않을 수 있습니다.
위 내용은 C 클래스에서 정적 Non-Const 멤버와 정적 배열을 직접 초기화할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!