본문 바로가기

Effective C++

[EC++] 항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자

  만약 우리가 클래스를 만들때, 클래스안에 아무것도 넣지 않았다면, 컴파일러가 복사 생성자(copy constructor), 복사 대입 연산자(copy assignment operator), 소멸자(destructor)를 저절로 선언해 주게 됩니다. 이때 컴파일러가 만드는 함수의 형태는 모두 기본형이고 public 멤버 이면서 inline 함수 입니다. 

 즉, 위와 같이 선언된 클래스는 아래와 같다는 이야기 입니다. 
기본적으로 생성자와 소멸자는 클래스에 생성자나 소멸자가 없을때 자동생성이 되고, 복사 생성자나 복사 대입 연산자는 미리 존재하는 해당 함수가 없는데 아래와 같은 코드 상에서 그러한 함수를 호출하는 부분이 있다면 자동 생성이 됩니다. 
 기본 소멸자  
 : 컴파일러가 만드는 기본 소멸자에서 주의할 특성은 바로, 소멸자의 가상성 즉, virtual의 여부는 부모 클래스를 따라간다는 것이다. 이는 항목7에서 다시 다룬다.

 복사 생성자 / 대입 연산자  
 : 컴파일러가 자동적으로 만들어낸 복사 생성자/ 대입 연산자가 하는 일은 원복 객체의 비정적 데이터를 사본 객체쪽으로 그냥 복사하는 일이 전부입니다.  아래의 클래스를 보시죠. 
 여기 이 NameObject는 인자값을 가지고 있는 생성자가 존재합니다. 이렇게 생성자가 선언되어 있으므로, 컴파일러는 기본 생성자를 만들어내지 않습니다. 이 클래스는 생성자는 있는데, 복사 생성자 /  대입연산자는 선언되어 있지 않기 때문에, 만약 프로그래머가 이것을 사용한다고 하면, 이것의 기본형이 컴파일러에 의해 만들어 집니다. 

컴파일러는 경우에 따라 클래스에 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자를 암시적으로 만들어 놓을 수 있다.