default/delete(new delete 아님)
class Dog
{
private:
std::string mName;
int mAge;
};
// 컴파일러가 암시적으로 기본 생성자, 복사 생성자를 만들어 냄.
Dog myDog;
Dog copiedMyDog(myDog);
// 복사 생성자를 까먹고 얕은 복사를 수행함.
class Dog
{
public:
Dog();
Dog(std::string name);
private:
std::string mName;
int mAge;
};
Dog::Dog()
{
// 빈 생성자를 만듬으로서 복사 생성자를 명시적으로 구현 할 수밖에 없도록
// 만들었지만 말 그대로 빈 생성자가 되어서 별로 보기는 좋지 않다.
}
Dog::Dog(std::string name)
{
// ... 깊은 복사...
}
- 위 문제를 default 키워드로 해결 할 수 있다.
class Dog
{
public:
Dog() = default;// 초기화 안 해줘도 문제 없다고 확인 가능.
Dog(const std::string& name);
private:
std::string mName;
};
//컴파일러가 Dog()를 대신 만들어 냄.
Dog::Dog(const std::string& name)
{
}
default 키워드
- default 키워드를 사용하면, 컴파일러가 특정한 생성자, 연산자 및 소멸자를 만들어 낼 수 있음
- 그래서 비어 있는 생성자나 소멸자를 구체화할 필요가 없음
- 또한 기본 생성자, 연산자 및 소멸자를 더 분명하게 표시할 수 있음
컴파일러가 만든 생성자를 삭제하는 방법은??
class Dog
{
public:
Dog() = default;
private:
Dog(const Dog& other);// 사실 C++의 용도에 맞지 않게 사용하는 것임.
};
:
Dog myDog;
Dog copiedMyDog(myDog); <-- 에러
class Dog
{
public:
Dog() = default;
Dog(const Dog& other) = delete;// 좀더 명확하세 의도를 설명 가능
};
:
Dog myDog;
Dog copiedMyDog(myDog);// 에러
delete 키워드
- 컴파일러가 자동으로 생성자를 만들어 주길 원치 않는다면 delete 키워드를 사용
- private 접근 제어자로 빈 생성자를 만드는 트릭을 사용 할 필요 없음
- "올바른 에러 메시지 나옴"
default/delete에 관한 Best Practice
- 어디에나 default/delete 사용할 것, 그냥 사용할 것
- 컴파일러가 코드를 생성하는 암시적 방식에 기댈 필요가 없음
- 명확해야 함.