답변
당신이 struct
선언에 비 정적 멤버를 초기화하려면 :
++ (안 C), structs
클래스와 거의 동의어 및 수 멤버는 생성자에서 초기화됩니다.
struct s {
int i;
s(): i(10)
{
}
};
당신은 예를 초기화 할 경우 : C 또는 C에서
++ :
struct s {
int i;
};
...
struct s s_instance = { 10 };
C99 또한 기능이 지정 촉구했다 초기화 :이
struct s {
int i;
};
...
struct s s_instance = {
.i = 10,
};
을 또한 C99 desi와 매우 유사한 GNU C 확장입니다. 초기화를 gnated하지만 더 휴대용 무언가를 사용하는 것이 좋습니다 :
struct s s_instance = {
i: 10,
};
마지막 예제를 자세히 설명해 주시겠습니까? – barnes
편집 :이 문제는 원래 c++
태그했지만 포스터는 내가 대답을 떠날거야, c
그래서 난이 질문을 다시 태그에 관한 것 말했다 하지만 ...
C++에서 은 구성원 및 상속에 대해 private
이 아닌 public
의 기본값 인 class
일뿐입니다.
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?" };
직접적인 대답은 구조체 정의가 초기화 될 수있는 변수가 아니라 형식을 선언하기 때문입니다. 예 :
이것은 변수를 선언하지 않으며 유형을 정의합니다. 멋진 인 (
으로 체커는 지적struct s { int i; } t = { 10 };
, C99, 당신은 또한 지정된 사용할 수 있습니다 이니셜을 : 변수를 선언하려면 }
와 ;
사이에 이름을 추가 한 다음 나중에 초기화 것 개선 - 언젠가, C는 Fortran 66이 데이터 초기화를 위해 가지고있는 다른 기능들을 따라 잡을 것이고, 주로 이니셜 라이저를 반복해서 반복 할 수있다. 이 간단한 구조로는 아무런 이점도 없습니다.말하자면, 20 명의 멤버를 가진 구조체가 있고 그 중 하나만 초기화해야하는 경우 (예를 들어 나머지 구조체가 초기화되었거나 초기화되지 않았 음을 나타내는 플래그가 있기 때문에) 유용합니다 :
struct s { int i; } t = { .i = 10 };
이 표기법을 사용하여 공용체를 초기화하고 공용 구조체의 어느 요소를 초기화할지 선택할 수 있습니다.
우리가 실제로하는 것보다 구조체를 선언했을 때 컴파일러에게 그 존재에 대한 정보를 알려주기 때문에 초기화 할 수 없습니다. 즉 메모리를 할당하지 않은 상태에서 멤버를 초기화하면 컴파일러에게 알립니다. 일반적으로 변수 컴파일러가 선언 한 장소에 의존하는 변수를 초기화 할 때 그 변수에 메모리를 할당하면 어떻게됩니까?
int a = 10;
- 이 자동 스택 메모리는 데이터를 유지하는 데 필요한 사항 메모리 메모리
를 할당하려고 데이터 섹션에서보다 글로벌 그래서 경우
당신의 대답은 좋은 것처럼 보이지만 예를 들어 당신의 말씨를 바로 잡아서 더 명확하게 만들어야합니다! – gsamaras
분명히 고맙다고 생각합니다. –
참고 :
struct s {
int i = 10;
};
이 오래된 질문이지만, 구글에서 높은 순위뿐만 아니라 명확하게 될 수 있습니다.
정확히 무엇을합니까? 이것은 기본 생성자의 초기화 값과 비슷합니까? 그렇다면 : 복사 또는 이동 생성자가 호출 될 경우이 할당이 수행됩니까? – starturtle
기본적으로 멤버가 명시 적으로 초기화되지 않으면 생성자의 멤버 초기화 목록에 삽입됩니다. – Trass3r
당신이 말했듯이 그것은 변수가 아닌 단지 회원입니다. 변수를 선언 할 때 컴파일러는 값을 넣을 수있는 변수에 대한 메모리 공간도 제공합니다. struct 멤버의 경우에는 컴파일러가 이에 대한 메모리 공간을 제공하지 않으므로 해당 struct 유형의 변수를 만들지 않으면 struct 멤버에 값을 할당 할 수 없습니다.
선언이 아니고 선언이 아니기 때문에 – Archmede
최근 C++에서는 다음과 같은 답변을 볼 수 있습니다. (최근 수십 년 동안의 C++.)이 질문은 C로 재조정 된 것이지만 C++ 응답은 우리 중 많은 사람들이 찾고있는 것입니다 ... – sage