ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Effective C++...3
    일지 2022. 5. 31. 07:51

    객체 사용 전 초기화 처리

    객체 사용 전에는 항상 초기화 처리를 해 줘야 한다. C++에서 사용하는 C 부분은 객체를 초기화해준다는 보장이 없다.

    어떤 게 초기화를 보장하고 어떤 게 그렇지 않은지 모두 외울 수 없으므로 항상 초기화를 해 줘야 한다.

     

    멤버 초기화 리스트 사용

    생성자 내에서 대입을 하는 대신 멤버 초기화 리스트로 초기화를 해주는 게 좋다.


    ABEntry::ABEntry(const std::string& name, const std::string& address)

    {

        theName = name;

        theAddress = address; // 이건 초기화가 아니라 대입이다.

    }

     

    ABEntry::ABEntry(const std::string& name, const std::string& address)

        : theName(name), theAddress(address)

    { }

     

    ABEntry::ABEntry()    : theName(), theAddress() // 각각 기본 생성자가  호출되도록 한다.{  }


     

    클래스 초기화 순서

    클래스의 초기화 순서는 어느 컴파일러를 사용하더라도 동일하다.

    1. 기본 클래스가 파생 클래스보다 먼저 초기화된다.
    2. 클래스의 멤버 변수는 선언된 순서대로 초기화된다.

    멤버 변수도 초기화 순서에 따라 에러가 발생하는 경우도 있으니 초기화 위치를 순서에 맞게 배치해야 한다.

     

    정적 객체의 초기화 방법

    함수 안에서 선언된 지역 정적 객체를 제외한 정적 객체(전역, 네임스페이스, 클래스, 파일)는 초기화 순서가 정해져 있지 않다. 그로 인해 초기화되지 않은 객체를 사용하려고 하는 문제가 발생할 수 있다.

     

    이를 막기 위해서 정적 객체의 레퍼런스를 반환하는 함수를 만들어 사용하면 된다.


    FileSystem& tfs()

    {

        // 함수 호출 시 해당 객체의 선언이 최초로 실행되는 때에 초기화되므로 초기화 순서를 고정시킬 수 있다.

        static FileSystem fs;

        return fs;

    }

     

    Directory::Directory(params)

    {

        std::size_t disks = tfs().numDisks();

    }


     

    ※ 함수 호출이 잦아질 수 있으나 멀티 스레드 등에서 정적 객체를 사용하다 문제가 발생하는 것을 방지할 수 있다는 장점이 있다.

     

    댓글

Designed by Tistory.