> 백엔드 개발 > C++ > C의 클래스 정의 내에서 비Const 정적 멤버 또는 정적 배열을 초기화할 수 없는 이유는 무엇입니까?

C의 클래스 정의 내에서 비Const 정적 멤버 또는 정적 배열을 초기화할 수 없는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-06 05:00:11
원래의
287명이 탐색했습니다.

Why Can't Non-Const Static Members or Static Arrays Be Initialized Inside a Class Definition in C  ?

비상수 정적 멤버 또는 정적 배열을 클래스 내에서 초기화할 수 없는 이유는 무엇입니까?

클래스 내에서 정적 데이터 멤버는 다음을 수행할 수 있습니다. 상수이고 정수 유형인 경우에만 초기화됩니다. 이러한 제한은 모든 개체에 고유한 정의가 있어야 한다는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿