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선언한 후에 구현은 하지 않은 채로 두는 방법이다.