초기화 리스트를 써서 초기화할 때 코드 순서가 지켜지나요?


초기화 리스트에서 코드에 적은 순서대로 초기화가 일어난다고 생각하고 코드를 썼습니다.

예를 들어

class A{
private:
    OtherClass var1;
    AnotherClass var2;
public:
    A(OtherClass o, int y) :
    var1(o), var2(var1, y) { }

};

같이 var2를 초기화할 때 var1을 갖고 하기 때문에 var2가 초기화되기 전에 va1이 초기화된다고 보장돼야 합니다.

제 컴퓨터에서는 잘 실행되는데 이게 표준으로 정해진 건지 확실하지가 않아서 불안합니다

  • 2016년 01월 29일에 작성됨

조회수 151


1 답변


좋아요
0
싫어요
채택취소하기

초기화 되는 순서는

  1. 초기화 리스트에 쓴 순서가 아니라,
  2. 클래스 안에서 선언된 순서를 따릅니다.

즉,

private:
    OtherClass var1;
    AnotherClass var2;

에서

private:
    AnotherClass var2;
    OtherClass var1;

같이 바꾼 경우는 var2var1보다 먼저 초기화를 시작하기 때문에 에러가 발생합니다.

C++이 이렇게 구현된 건 소멸자는 멤버가 생성된 순서와 정 반대로 멤버를 정리하기 때문입니다.

생성자는 여러 개지만 소멸자는 하나밖에 없기 때문에 생성자를 기준으로 소멸자를 구현할 경우 생성자 별로 멤버가 어떤 순서로 생성됐는지 기억해둬야 하는 반면, 선언된 순서는 모든 객체에서 동일하기 때문에 이 경우는 생성 순서는 항상 고정입니다.

  • 2016년 01월 29일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close