C++ - default/delete

mohadang·2022년 10월 10일
0

C++

목록 보기
21/48
post-thumbnail

default/delete(new delete 아님)

  • 문제 1) 암시적 생성자
class Dog
{
private:
  std::string mName;
  int mAge;
};

// 컴파일러가 암시적으로 기본 생성자, 복사 생성자를 만들어 냄.

Dog myDog;
Dog copiedMyDog(myDog);
// 복사 생성자를 까먹고 얕은 복사를 수행함.
  • 문제 2) 빈 생성자 만들기
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 키워드를 사용하면, 컴파일러가 특정한 생성자, 연산자 및 소멸자를 만들어 낼 수 있음
  • 그래서 비어 있는 생성자나 소멸자를 구체화할 필요가 없음
  • 또한 기본 생성자, 연산자 및 소멸자를 더 분명하게 표시할 수 있음
    • 명확하게 표현하는 것은 항상 좋다.

컴파일러가 만든 생성자를 삭제하는 방법은??

  • C++11 이전
class Dog
{
public:
  Dog() = default;
private:
  Dog(const Dog& other);// 사실 C++의 용도에 맞지 않게 사용하는 것임.
};
  :
Dog myDog;
Dog copiedMyDog(myDog); <-- 에러
  • C++ 11 이후
class Dog
{
public:
  Dog() = default;
  Dog(const Dog& other) = delete;// 좀더 명확하세 의도를 설명 가능
};
  :
Dog myDog;
Dog copiedMyDog(myDog);// 에러

delete 키워드

  • 컴파일러가 자동으로 생성자를 만들어 주길 원치 않는다면 delete 키워드를 사용
  • private 접근 제어자로 빈 생성자를 만드는 트릭을 사용 할 필요 없음
  • "올바른 에러 메시지 나옴"

default/delete에 관한 Best Practice

  • 어디에나 default/delete 사용할 것, 그냥 사용할 것
  • 컴파일러가 코드를 생성하는 암시적 방식에 기댈 필요가 없음
  • 명확해야 함.
profile
mohadang

0개의 댓글