생성자 초기화 목록에서 배열 멤버 초기화
C는 생성자의 멤버 초기화 목록을 사용하여 클래스 멤버를 초기화하는 기능을 제공합니다. 그러나 이런 방식으로 배열 멤버를 초기화하면 컴파일 오류가 발생할 수 있습니다.
아래 코드 조각은 생성자 초기화 목록에서 배열 멤버의 초기화 시도를 보여 주지만 컴파일에 실패합니다.
class C { public: C() : arr({1,2,3}) { // doesn't compile } /* C() : arr{1,2,3} // doesn't compile either } */ private: int arr[3]; };
이 문제의 원인은 배열 초기화에 대한 제한 때문입니다. 다음 예에서 볼 수 있듯이 배열은 할당 구문('=')을 통해서만 초기화할 수 있습니다.
int arr[3] = {1,3,4};
질문과 답변:
1 . 생성자 초기화 목록에서 배열을 초기화하는 방법은 무엇입니까?
생성자 초기화 목록에서 배열을 초기화하려면 배열을 멤버 변수로 포함하는 구조체를 사용해야 합니다.
struct ArrStruct { int arr[3]; ArrStruct() : arr{1,2,3} { } }; class C { public: C() : arr_struct(ArrStruct()) { } private: ArrStruct arr_struct; };
이 접근 방식에는 배열을 보유하기 위한 별도의 구조체를 만든 다음 해당 구조체 내에서 구조체를 초기화하는 작업이 포함됩니다. 생성자.
2. C 03 표준 및 배열 초기화
C 03 표준은 생성자 이니셜라이저 목록의 집계(배열 포함) 초기화를 명시적으로 다루지 않습니다. 원래 예제의 코드가 유효하지 않은 이유는 이니셜라이저 목록을 통한 집계의 직접 초기화를 금지하는 일반 규칙에서 비롯됩니다.
3. C 11 목록 초기화
C 11 목록 초기화는 이 문제에 대한 해결책을 제공합니다. 그러나 원래 질문의 구문이 올바르지 않습니다. 올바른 구문은 다음과 같습니다.
struct A { int foo[3]; A() : foo{1, 2, 3} { } };
중괄호를 사용하면 C 11의 목록 초기화 기능이 직접 실행됩니다.
위 내용은 C 생성자 초기화 목록에서 배열을 초기화할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!