[ Effective C++ ] 항목 4 : 객체를 사용하기 전에 반드시 그 객체를 초기화 하자!

Minsu._.Lighting·2023년 11월 14일
0

[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "

[핵심]

" 모든 객체를 초기화 하는 습관을 들여라! "

  • 기본제공 타입의 객체는 직접 손으로 초기화 하자!
  • 생성자에서는 데이터 멤버에 대한 대입이 아닌, 초기화 리스트를 사용한 초기화를 하자!

💡 C++의 객체 초기화

  • 언제 초기화가 보장되고 그렇지 않은지 명확한 규칙이 있음.
  • 하지만 규칙이 다소 복잡 함.
    C++의 C부분만을 쓴다면 초기화가 된다는 보장이 없으나, 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객체가 초기화가 안되어 있어 비정상적인 동작을 일으킬 수 있음.

  • 비지역 정적 객체를 함수 안에 넣어주어 지역 정적 객체로 만들고 이 함수는 객체의 참조자를 반환시켜 해결!
    - 싱글톤 패턴

    • 참조자 반환 함수는 내부적으로 정적 객체를 쓰기 때문에 다중 스레드 프로그램에선 장애를 일으킬 수 있음.
    • 객체의 초기화 순서를 맞춰야 제대로 동작 함.
      ( A객체 초기화 시 B객체 필요... 그런데 초기화 순서는 A -> B 순서...? 🤐 )
profile
오코완~😤😤

0개의 댓글

관련 채용 정보