초기화되지 않은 값을 읽도록 내버려 두면 정의되지 않은 동작이 그대로 흘러 나오게 된다.

모든 객체를 사용하기 전에 항상 초기화 하자! 기본제공 타입으로 만들어진 비멤버 객체에 대해서는 초기화를 손수 해야 한다.

int x = 0;      // int의 직접 초기화

const char* text = "A C-style string"; // 포인터의 직접 초기화

double d;     // 입력 스트림에서 읽음으로써
std::cin >> d;   // "초기화" 수행

이런 부분을 제외하고 나면, C++의 초기화의 나머지 부분은 생성자로 귀결된다. 생성자에서 지킬 규칙은 간단하다. 그 객체의 모든 것을 초기화하자! 단 대입(assignment)을 초기화(initialization)와 헷갈리지 말자!

class PhoneNumber { ... };

class ABEntry {
public:
 ABEntry(const std::string& name, const std::string& address,
     const std::list<PhoneNumber>& phones);
private:
 std::string theName;
 std::string theAddress;
 std::list<phoneNumber> thePhones;
 int numTimesConsulted;
};

ABEntry::ABEntry(const std::string& name, const std::string& address,
        const std::list<PhoneNumber>& phones)
{
 theName = name;       // 이것은 초기화가 아닌 '대입' 이다.
 theAddress = adress;
 thePhones = phones;
 numTimesConsulted = 0;

}


ABEntry::ABEntry(const std::string& name, const std::string& address,
        const std::list<PhoneNumber>& phones)
 : theName(name),       // 이것이 바로 '초기화' 이다.
 theAddress(adress),
 thePhones(phones),
 numTimesConsulted(0)

{}               // 생성자에는 아무것도 없다.


C++ 객체를 구성하는 데이터의 초기화 순서

1. 기본 클래스는 파생 클래스보다 먼저 초기화된다.
2. 클래스 데이터 멤버는 그들이 선언된 순서대로 초기화 된다.


정적 객체(static object) 의 종류

1. 전역 객체.
2. 네임스페이스 유효범위에서 정의된 객체.
3. 클래스 안에서 static으로 선언된 객체.
4. 함수 안에서 static으로 선언된 객체.
5. 파일 유효범위에서 static으로 정의된 객체

정적 객체(static object) 의 주의점

1. 이중에서 함수 안에 있는 객체는 지역 정적 객체(local static object)라고 하고, 나머지는 비지역 정적 객체(non-local static object)라고 한다. 정적 객체는 프로그램이 끝날 떄 자동으로 소멸된다.

2. 별개의 지역에서 정의된 비지역 정적 객체들의 초기화 순서는 정해져 있지 않으므로 주의 하자.


이것만은 잊지 말자!
- 기본제공 타입의 객체는 직접 손으로 초기화 한다. 경우에 따라 저절로 되기도 하고 안되기도 하기 떄문이다.
- 생성자에서는 데이터 멤버에 대한 대입문을 생성자 본문 내부에 넣는 방법으로 멤버를 초기화 하지 말고 멤버 초기화 리스트를 즐겨 사용하자. 그리고 초기화 리스트에 데이터 멤버르 ㄹ나열할 떄는 클래스에 각 데이터 멤버가 선언된 순서와 똑같이 나열하자.
- 여러 번역 단위에 있는 비지역 정적 객체들의 초기화 순서 문제는 피해서 설계해야 한다. 비지역 정적 객체를 지역 정적 객체로 바꾸면 된다.

관련링크
http://ikpil.tistory.com/405
posted by deviAk