관리 메뉴

기억을 위한 기록들

[CPP-effective] 2-1 C++가 은근슬쩍 만드는 함수를 주의하자. 본문

C & CPP/Effective C++

[CPP-effective] 2-1 C++가 은근슬쩍 만드는 함수를 주의하자.

에드윈H 2021. 3. 5. 15:31

 

 

일부 멤버 함수들은 C++에서 클래스 안에 직접 선언해 넣지 않으면 컴파일러가 자동으로 선언해주도록 되어 있습니다.

 

바로.

 

1. 복사 생성자(copy constructor)

2. 복사 대입 연산자(copy assignment operator)

3. 소멸자(destructor)

4. 기본 생성자 (선언 해놓지 않았다면)

가 있습니다.

컴파일러가 만드는 함수의 형태는 모두 기본형이다. 모두 public 멤버이며 inline 함수입니다.

 

class Player {};

이렇게 선언한 클래스와  아래와 같이 선언한 클래스가 대동소이하다는 것입니다.

class Player
{
public:
     Player() // 기본생성자
     {}
     
     Player(const Player& rhs) //복사 생성자
     {}
     
     ~Player() //소멸자 *소멸자는 항상 가상 소멸자가 좋습니다.
     {}

	 Player operator=(const Player& rhs) //복사 대입 연산자
     {}  

};

 

이들은 꼭 필요하다고 컴파일러가 판단할 때만 만들어지도록 되어 있지만, 필요한 조건이 대단하진 않습니다.

 

Player p1; //기본생성자 그리고 소멸자
Player p2(p1) // 복사 생성자

p1=p2; //대입연산자

 

 

하지만, 작성자가 기본 생성자를 선언하지 않고, 파라미터를 받은 생성자만 선언해놓았다면, 컴파일러는 기본 생성자를 만들지 않는다.

 

 

 

정리

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

 

 

다른 또 하나의 방법으로는 

 

 

* 컴파일러에서 자동으로 제공하는 기능을 허용치 않으려면, 대응 되는 멤버 함수를 private선언한 후에 구현은 하지 않은 채로 두는 방법이다.