비상수 정적 멤버 또는 정적 배열을 클래스 내에서 초기화할 수 없는 이유는 무엇입니까?
클래스 내에서 정적 데이터 멤버는 다음을 수행할 수 있습니다. 상수이고 정수 유형인 경우에만 초기화됩니다. 이러한 제한은 모든 개체에 고유한 정의가 있어야 한다는 C 표준의 요구 사항에서 발생합니다.
비상수 정적 멤버 초기화:
C 표준에 따르면(C 03 9.4 .2), const가 아닌 유형의 정적 데이터 멤버는 클래스 정의 내에서 초기화될 수 없습니다. 다음 코드는 이를 보여줍니다.
class A { static int b = 3; };
정적 멤버 b가 non-const이고 클래스 내에서 초기화를 시도하므로 이 코드는 표준을 위반하고 오류를 생성합니다.
정적 배열 초기화:
마찬가지로 정적 배열은 클래스 정의 내에서 초기화될 수 없습니다. 그들은 const입니다. 이는 정적 배열이 메모리에 객체로 저장되기 때문입니다. 따라서 고유한 정의에 대한 요구 사항을 위반하므로 클래스 정의 내에서 초기화할 수 없습니다.
class A { static const int c[2] = { 1, 2 }; };
이 코드도 표준을 위반하고 오류가 발생합니다.
해결 방법 및 이유:
클래스 내에서 정적 배열을 초기화하는 한 가지 해결 방법은 "enum"을 사용하는 것입니다.
class A { static const int a = 3; enum { arrsize = 2 }; static const int c[arrsize] = { 1, 2 }; };
정적 데이터 멤버의 클래스 내 초기화를 금지하는 이유는 클래스 선언이 포함된 헤더 파일이 일반적으로 여러 번역 단위에 포함된다는 사실과 관련이 있습니다. 링커 문제를 방지하려면 C에서는 모든 개체에 고유한 정의가 있어야 합니다. 메모리 상주 엔터티의 클래스 내 초기화가 허용되면 이 규칙이 깨집니다.
그러나 C 11에서는 제한이 어느 정도 완화되었습니다. 정적 데이터 멤버가 const 리터럴 유형인 경우 클래스 정의 내에서 중괄호 또는 동등 초기화 프로그램을 사용하여 초기화할 수 있습니다. 또한 이제 선언 시점에서 비정적 데이터 멤버를 초기화할 수 있습니다. 이러한 기능은 gcc 4.7과 같은 모든 컴파일러에서 아직 완전히 구현되지 않았습니다.
위 내용은 C의 클래스 정의 내에서 비Const 정적 멤버 또는 정적 배열을 초기화할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!