초기화 리스트를 써서 초기화할 때 코드 순서가 지켜지나요?
조회수 1786회
초기화 리스트에서 코드에 적은 순서대로 초기화가 일어난다고 생각하고 코드를 썼습니다.
예를 들어
class A{
private:
OtherClass var1;
AnotherClass var2;
public:
A(OtherClass o, int y) :
var1(o), var2(var1, y) { }
};
같이 var2
를 초기화할 때 var1
을 갖고 하기 때문에
var2
가 초기화되기 전에 va1
이 초기화된다고 보장돼야 합니다.
제 컴퓨터에서는 잘 실행되는데 이게 표준으로 정해진 건지 확실하지가 않아서 불안합니다
1 답변
-
초기화 되는 순서는
- 초기화 리스트에 쓴 순서가 아니라,
- 클래스 안에서 선언된 순서를 따릅니다.
즉,
private: OtherClass var1; AnotherClass var2;
에서
private: AnotherClass var2; OtherClass var1;
같이 바꾼 경우는
var2
가var1
보다 먼저 초기화를 시작하기 때문에 에러가 발생합니다.C++이 이렇게 구현된 건 소멸자는 멤버가 생성된 순서와 정 반대로 멤버를 정리하기 때문입니다.
생성자는 여러 개지만 소멸자는 하나밖에 없기 때문에 생성자를 기준으로 소멸자를 구현할 경우 생성자 별로 멤버가 어떤 순서로 생성됐는지 기억해둬야 하는 반면, 선언된 순서는 모든 객체에서 동일하기 때문에 이 경우는 생성 순서는 항상 고정입니다.
댓글 입력