[C++] 객체 생성 시 초기화

    객체는 항상 초기화된다는 보장이 없어 항상 객체를 사용하기 전에 초기화를 해줘야 한다.

    class Person{
    public:
        Person(string inName, int inAge);
    private:
        string name;
        int age;
    };
    
    // 1. 대입
    Person(string inName, int inAge)
    {
        name = inName;
        age = inAge;
    }
        
    // 2. 멤버 초기화 리스트
    Person(string inName, int inAge)
        : name(inName), age(inAge)
    {}

    첫 번째 방법은 초기화가 아닌 생성자 초기화를 지나 값을 대입하고 있는 것이다.

    기본 생성자 호출 > 복사 대입 연산자 호출 이 되고 있는 것이다.

     

    두 번째 방법은 복사 생성자에 의해 초기화된다.

    기본 생성자 호출 후에 복사 대입 연산자를 호출하는 것보다 복사 생성자를 한 번 호출하는 쪽이 더 효율적이다.

     

    멤버 초기화 리스트

    생성자 괄호() 뒤에 콜론(:)을 붙이고 멤버 변수를 쉼표(,)로 구분하여 나열한다.

    초기화 순서는 기본 클래스 생성자 > 파생 클래스 생성자이며 클래스 데이터 멤버는 선언된 순서대로 초기화되기 때문에 멤버 변수를 나열할 때는 선언한 순서대로 나열하는 것이 좋다.

     

    const 변수 초기화

    생성과 동시에 초기화해줘야 하는 const 변수의 경우 멤버 초기화 리스트를 통해 초기화 시킬 수 있다.

    class Person{
    public:
        Person(string inName, int inAge);
    private:
        const string name;
        int age;
    };
    
    Person(string inName, int inAge)
        : name(inName), age(inAge)
    {}
    
    Person(string inName, int inAge)
    {
        name = inName; // error! const 변수에 값을 대입하는 것은 불가능
        age = inAge; // ok!
    }

     

    정적 객체 초기화

     

    정적 객체 범위

    1. 전역 객체
    2. namespace 유효범위 내 정의된 객체
    3. 클래스 내 static  객체
    4. 함수 내 static  객체
    5. 파일 유효범위 내 static 객체

    지역 정적 객체: 함수 안에 있는 static 객체

    비지역 정적 객체: 이외 나머지

     

    정적 객체는 프로그램이 끝날 때 소멸된다. (main() 함수의 실행이 끝날 때 정적 객체의 소멸자가 호출된다.)

    다른 번역 단위에 정의된 비지역 정적 객체들의 초기화 순서는 정해져 있지 않다.

     

    class FileSystem{
    public:
        size_t numDisks() const;
    };
    
    extern FileSystem tfs;
    
    //
    
    class Directory{
    public:
        Directory( params );
    };
    
    Directory::Directory( params )
    {
        size_t disks = tfs.numDisks();
    }

    FileSystem보다 Directory가 먼저 생성될 경우 에러가 발생된다.

    이와같은 문제는 비지역 정적 객체를 지역 정적 객체로 바꿔주면 해결된다.

    class FileSystem { ... };
    FileSystem& tfs() // tfs 객체를 이 함수로 대체
    {
        static FileSystem fs;
        return fs;
    }
    
    class Directory { ... };
    Directory::Directory( params )
    {
        size_t disks = tfs().numDisks();
    }

     


    출처: Effective C++ / Scott Meyers

    댓글