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

조회수 1783회

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

예를 들어

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

};

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

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

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    초기화 되는 순서는

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

    즉,

    private:
        OtherClass var1;
        AnotherClass var2;
    

    에서

    private:
        AnotherClass var2;
        OtherClass var1;
    

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

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

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)