C++구성원 변수의 초기 화 순서 문제 에 대한 자세 한 설명

C++구성원 변수의 초기 화 순서 문제 에 대한 자세 한 설명
질문 출처:
면접 문제 에서 시험관 은 간단 한 프로그램 출력 결과 값 의 문 제 를 냈 다.다음 과 같다.


class A 
{ 
private: 
 int n1; 
 int n2; 
  
public: 
 A():n2(0),n1(n2+2){} 
 
 void Print(){ 
  cout << "n1:" << n1 << ", n2: " << n2 <<endl; 
 } 
}; 
 
int main() 
{ 
 
 A a; 
 a.Print(); 
 
 return 1; 
} 
 

 이때 그 수험생 은 이렇게 대답 했다.n1 은 2,n2 는 0 이다.
내 컴퓨터 에서 출력 한 결 과 는:

당신 도 그렇게 대답 하면 멤버 목록 을 초기 화 하 는 순 서 를 모 를 것 입 니 다.
만약 내 가 A 류 의 구조 함 수 를 다음 과 같이 바꾼다 면:

A() 
{ 
 n2 = 0; 
 n1 = n2 +2; 
} 
 

그러면 이 출력 결 과 는:
 
분석:   
1.구성원 변 수 는 초기 화 목록 을 사용 하여 초기 화 할 때 구조 함수 에서 구성원 목록 을 초기 화 하 는 순서 와 상 관 없 이 구성원 변 수 를 정의 하 는 순서 와 만 관련 이 있 습 니 다.구성원 변수의 초기 화 순 서 는 변수 가 메모리 에서 순서 와 관련 이 있 기 때문에 메모리 의 배열 순 서 는 컴 파일 기간 에 변수의 정의 순서 에 따라 결정 되 었 습 니 다.이 점 은 EffectiveC++에 상세 하 게 소개 되 어 있 습 니 다.
2.초기 화 목록 초기 화 를 사용 하지 않 으 면 구조 함수 에서 초기 화 할 때 구성원 변수 가 구조 함수 에 있 는 위치 와 관련 이 있 습 니 다.
3.주의:클래스 구성원 이 정의 할 때 초기 화 할 수 없습니다.
4.주의:클래스 의 const 구성원 상수 가 구조 함수 초기 화 목록 에서 초기 화 되 어야 합 니 다.
5.주의:클래스 의 static 구성원 변 수 는 클래스 밖에서 초기 화 해 야 합 니 다.
6.정적 변 수 를 초기 화 하 는 순 서 는 기본 클래스 의 정적 변 수 를 초기 화 한 다음 에 파생 클래스 입 니 다.모든 정적 변수 가 초기 화 될 때 까지.전역 변수 와 정적 변수의 초기 화 는 순 서 를 가리 지 않 습 니 다.이것 도 이해 하기 어렵 지 않다.사실 정적 변수 와 전역 변 수 는 모두 공공 메모리 구역 에 놓 여 있다.정적 변 수 를'역할 영역'을 가 진 전역 변수 로 이해 할 수 있 습 니 다.모든 초기 화 작업 이 끝 난 후에 main 함수 가 호출 됩 니 다.특정한 종류의 구조 함수 가 실 행 될 경우 먼저 기본 클래스 의 구성원 변 수 는 초기 화 됩 니 다.  

bbb       :
private:
int n1;
int n2;
bbb     :
bbb::bbb()
:n2(1),
n1(2)
{
}
어 셈 블 리 코드:

00401535 mov eax,dword ptr [ebp-4]
00401538 mov dword ptr [eax+4],2
0040153F mov ecx,dword ptr [ebp-4]
00401542 mov dword ptr [ecx+8],1
그리고 파생 체인 에 따라 파생 류 의 구성원 함 수 를 초기 화 합 니 다.
요약:
   변수의 초기 화 순 서 는 다음 과 같 아야 합 니 다.

1             
2              
3        
4         

읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기