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

C 클래스에서 정적 멤버와 배열을 직접 초기화할 수 없는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-08 06:08:11733검색

Why Can't I Initialize Static Members and Arrays Directly in a C   Class?

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

C에서는 정적 데이터 특정 특정 경우를 제외하고는 클래스의 멤버를 클래스 정의 내에서 직접 초기화할 수 없습니다.

비상수 정적 멤버 초기화를 제한하는 이유

정적 데이터 멤버는 프로그램의 메모리 세그먼트에 할당되며 프로그램의 모든 인스턴스에서 공유됩니다. 수업. C 표준은 여러 번역 단위에서 동일한 변수에 대한 여러 정의를 방지하기 위해 클래스 내 초기화를 금지합니다.

정적 배열 초기화를 제한하는 이유

마찬가지로, 배열은 연속적인 메모리 블록을 차지하므로 클래스의 정적 배열은 클래스 내에서 초기화될 수 없습니다. 클래스 내 초기화를 허용하면 각 번역 단위에서 동일한 배열의 여러 복사본이 생성되어 예기치 않은 동작이 발생하게 됩니다.

Const Integral 및 Enum 유형에 대한 예외

정적 const 정수 유형 및 열거형 유형에는 이러한 규칙에 대한 예외가 있습니다. 이러한 유형은 컴파일 시간 상수로 처리되고 해당 값이 컴파일 순간에 알려지기 때문에 클래스 내에서 초기화될 수 있습니다.

배열 초기화 해결 방법

클래스에서 정적 배열을 초기화하려면 "enum 트릭"을 사용할 수 있습니다.

enum { arrsize = 2 };
static const int c[arrsize] = { 1, 2 };

이 접근 방식은 열거형 상수 arrsize를 선언하여 배열 크기를 결정한 다음 정적을 초기화하는 데 사용됩니다. const 배열 c.

C의 진화 11

C 11은 이러한 제한을 다소 완화했습니다. 이제 "리터럴 유형"으로 알려진 특정 유형의 정적 데이터 멤버를 중괄호 또는 동등 초기화 프로그램을 사용하여 클래스 내에서 초기화할 수 있습니다. 또한 C 11에서는 상수 표현식을 사용하여 클래스 내에서 비정적 데이터 멤버를 초기화할 수 있습니다.

위 내용은 C 클래스에서 정적 멤버와 배열을 직접 초기화할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.