[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "
" 모든 객체를 초기화 하는 습관을 들여라! "
- 기본제공 타입의 객체는 직접 손으로 초기화 하자!
- 생성자에서는 데이터 멤버에 대한 대입이 아닌, 초기화 리스트를 사용한 초기화를 하자!
[배열과 STL의 벡터 차이]
- 배열은 각 공간에 초기화가 보장되지 않음.
- STL Vector는 각 공간에 초기를 보장.
무작위 비트 값을 읽고 객체가 쓰레기 값을 갖음.
초기화 되지 않은 값을 읽도록 내버려 두면 정의되지 않은 신비한 동작이 발생!
- [ 데이터 직접 초기화 ]
int iNum = 0;
- [ 데이터 직접 초기화 ]
const char* text= "Smile";
- [ 입력에 의한 초기화 ]
int iNum; cin >> iNum;
객체의 모든 것을 초기화 하자!
대입과 초기화를 헷갈리지 말자!
[대입 코드]
Player::Player(const string& strName, const int& iHP)
{
m_strName = strName;
m_iHP = iHP;
}
📢 어떤 객체든 그 객체의 데이터 멤버는 생성자의 본문이 실행되기 전 초기화 되어야 함.
📢 대입의 경우 기본 생성자 호출 후 복사 대입연산자를 호출 함.
[초기화 리스트 코드]
Player::Player(const string& strName, const int& iHP)
: m_strName(strName),
m_iHP(iHP)
{
}
📢 대입과 다르게 복사 생성자를 호출 하며 기본 제공 타입을 제외한 경우 기본 생성자 호출 후 복사 대입연산자를 호출하는 것 보다 복사 생성자를 한번 호출하는게 유리 함.
📢 기본 제공 타입의 경우 대입과 초기화의 비용 차이가 없기 때문.
[기본 생성자를 호출하는 초기화 리스트 코드]
Player::Player(const string& strName, const int& iHP)
: m_strName(),
m_iHP(0)
{
}
📢 위 처럼 기본 생성자를 호출하게 할 수 있음.
📢 습관을 들이는 것이 좋음.
기본 제공 타입의 멤버여도 초기화가 의무인 경우도 있음.
상수, 참조자의 경우 대입이 불가능 하기 때문
초기화 리스트가 너무 많아 지저분해 불편하다면??
대입으로 초기화가 가능한 데이터들을 묶어 private 함수로 만들어준 후 생성자에서 호출해 줌.
📢 파일이나 데이터 베이스에서 초기 값을 읽어올 경우 사용하면 유용 함.
기본 클래스는 파생 클래스보다 먼저 초기화 진행!
클래스 내 데이터 멤버들은 선언된 순서로 초기화 진행!
초기화 리스트에 넣어진 순서와는 관계 없이 선언 순서로만 이루어 짐
서로 다른 번역 단위에서 정의된 비지역 정적 객체들 사이에서 상대적인 초기화 순서는 정해져 있지 않음!
A객체 초기화 시 B객체의 데이터 멤버가 필요한데 순서가 정해져 있지 않으니 A객체 초기화 시점 B객체가 초기화가 안되어 있어 비정상적인 동작을 일으킬 수 있음.
비지역 정적 객체를 함수 안에 넣어주어 지역 정적 객체로 만들고 이 함수는 객체의 참조자를 반환시켜 해결!
- 싱글톤 패턴