programing

구조 내에서 구성원을 초기화할 수 없는 이유는 무엇입니까?

newsource 2022. 8. 16. 23:26

구조 내에서 구성원을 초기화할 수 없는 이유는 무엇입니까?

구조 내에서 구성원을 초기화할 수 없는 이유는 무엇입니까?

예:

struct s {
   int i = 10;
};

C++ 11 에서는, 다음의 선언이 허가되고 있는 것에 주의해 주세요.

struct s {
   int i = 10;
};

이것은 오래된 질문이지만, 구글에서 상위권에 랭크되어 있기 때문에, 명확해지는 것이 좋을지도 모른다.

직접적인 답변은 구조 정의가 초기화할 수 있는 변수가 아닌 유형을 선언하기 때문입니다.예를 들어 다음과 같습니다.

struct s { int i=10; };

이것은 변수를 선언하지 않고 유형을 정의합니다.변수를 선언하려면 다음 사이에 이름을 추가합니다.}및 그;그 후 초기화합니다.

struct s { int i; } t = { 10 };

Checkers가 지적한 바와 같이 C99에서는 지정된 이니셜라이저를 사용할 수도 있습니다(이는 놀라운 개선입니다. 언젠가 C는 Fortran 66이 데이터 초기화를 위해 가지고 있던 다른 기능(주로 지정 가능한 횟수만큼 이니셜라이저를 반복할 것입니다).이 단순한 구조로는 아무런 이득도 없다.예를 들어 멤버 수가 20개인 구조체가 있고 그 중 1개만 초기화하면 되는 경우(예를 들어 구조의 나머지 부분이 초기화되었는지 여부를 나타내는 플래그가 있기 때문에 초기화되지 않은 경우)는 다음과 같이 유용합니다.

struct s { int i; } t = { .i = 10 };

이 표기법은 유니언을 초기화하는 경우에도 사용할 수 있습니다.

스태틱하지 않은 멤버를 초기화하는 경우struct 선언:

C++에서는 (C가 아닌)structs는 클래스와 거의 동일하며 구성원을 생성자에서 초기화할 수 있습니다.

struct s {
    int i;

    s(): i(10)
    {
    }
};

인스턴스를 초기화하는 경우:

C 또는 C++의 경우:

struct s {
    int i;
};

...

struct s s_instance = { 10 };

C99에는 designated initializer라는 기능도 있습니다.

struct s {
    int i;
};

...

struct s s_instance = {
    .i = 10,
};

또한 C99 지정 이니셜라이저와 매우 유사한 GNU C 확장 기능도 있지만, 보다 휴대성이 좋은 것을 사용하는 것이 좋습니다.

struct s s_instance = {
    i: 10,
};

편집 2: 이 답변은 2008년에 작성되었으며 C++98에 관한 것입니다.이후 버전의 언어에서는 멤버 초기화 규칙이 변경되었습니다.

편집: 질문에는 원래 태그가 부착되어 있습니다.c++포스터에는 '그냥'이라고 적혀있었어요.c질문에 태그를 다시 붙여서 답을 남깁니다만...

C++ a의 경우struct그냥...class디폴트 설정public보다는private멤버와 상속을 위한 것입니다.

C++만 허용static const인라인으로 초기화되는 일체형 멤버, 컨스트럭터에서 다른 멤버를 초기화해야 하는 경우 또는struct는 초기화 목록의 POD입니다(변수를 선언하는 경우).

struct bad {
    static int answer = 42; // Error! not const
    const char* question = "what is life?"; // Error! not const or integral
};

struct good {
    static const int answer = 42; // OK
    const char* question;
    good() 
        : question("what is life?") // initialization list
        { }
};

struct pod { // plain old data
    int answer;
    const char* question;
};
pod p = { 42, "what is life?" };

실제 작업보다 더 많은 구조를 선언했을 때 컴파일러의 존재, 즉 할당된 메모리가 없으며 메모리가 없는 구성원을 초기화하면 해당 구성원을 초기화할 수 없기 때문에 초기화할 수 없습니다.일반적으로 변수 컴파일러가 해당 변수에 메모리 할당을 선언한 위치에 따라 변수를 초기화할 때 발생합니다.

int a = 10;
  • 할당하는 스택메모리보다 자동인 경우
  • 메모리가 할당하는 데이터 섹션보다 글로벌한 경우

따라서 데이터를 보관하는 데 필요한 메모리는 있지만 구조의 경우 초기화할 수 있는 메모리가 없습니다.

네가 말했듯이 변수가 아니라 그냥 멤버일 뿐이야.변수를 선언하면 컴파일러는 값을 넣을 수 있는 변수용 메모리 공간도 제공합니다.구조체 멤버의 경우 컴파일러가 메모리 공간을 제공하지 않으므로 해당 구조체 유형의 변수를 생성하지 않는 한 구조체 멤버에 값을 할당할 수 없습니다.

언급URL : https://stackoverflow.com/questions/225089/why-cant-we-initialize-members-inside-a-structure