Effective C++

객체를 사용하기 전에 반드시 그 객체를 초기화하자

Keisa 2024. 5. 19. 13:27

C++ 규칙에 의하면 어떤 객체이든 그 객체의 데이터 멤버는 생성자의 본문이 실행되기 전에 초기화되어야 한다라고 명기되어 있다.

 

항상 생성자의 멤버 초기화 리스트에 넣어서 초기화하는 습관을 들이도록한다. 명시적으로 초기화 된 멤버와 초기화가 되지 않은 멤버에 대한 구분이 명확해지고 생성 후 대입연산을 수행하는 것보다 생성자로 초기화하는 것이 더욱 효율적이기 때문.

 

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

1. 기본 클래스는 파생 클래스보다 먼저 초기화된다.

2. 클래스 데이터 멤버는 그들이 선언된 순서대로 초기화 된다. 초기화 리스트에 넣어진 순서가 다르더라도 초기화 순서는 선언된 순서와 같다.

 

비지역 정적 객체의 초기화 순서는 개별 번역 단위에서 정해진다.

 

정적객체(static)

1. 전역 객체

2. 네임스페이스 유효범위에서 정의된 객체

3. 클래스 안에서 static으로 선언된 객체

4. 함수 안에서 static으로 선언된 객체

5. 파일 유효범위에서 static으로 정의된 객체

 

이들 중 함수 안에 있는 정적 객체는 지역 정적 객체, 나머지는 비지역 정적 객체라고 한다.

 

번역 단위(translation unit)

컴파일을 통해 하나의 목적 파일을 만드는 바탕이되는 소스 코드. 여기서 번역은 소스의 언어를 기계어로 옮긴다는 의미이고, 기본적으로 소스 파일 하나가 되는데, 그 파일이 #include하는 파일(들)까지 합쳐서 하나의 번역 단위가 된다.

비지역 정적 객체의 초기화 순서는 정해져 있지 않으므로 서로 다른 소스파일을 오가야하는 비지역 정적 객체는 초기화가 이뤄지기 전에 사용될 우려가 있다. 따라서 함수 안에 선언한 지역 정적객체로 만들어 해당 함수를 호출하면 자연스레 초기화가 이뤄지도록하여 사용하는 것이 좋다.

static FileSystem& GetFileSystem()
{
  static FileSystem tfs;
  return tfs;
}

'Effective C++' 카테고리의 다른 글

낌새만 보이면 const를 들이대자  (0) 2024.05.18