특별한 멤버 함수들의 자동 작성 조건
- C++98: 기본 생성자, 소멸자, 복사 생성자, 복사 연산자
- C++11: 이동 생성자, 이동 연산자 추가
class widget
{
public:
widget(widget&& rhs); // 이동 생성자
widget& operator=(widget&& rhs); // 이동 연산자
};
3의 법칙(Rule of Three)
- 만일 복사 생성자와 복새 연산자, 소멸자 중 하나라도 선언했다면 모두 선언해야 한다.
복사 연산 자동 작성 조건
- 복사 생성자를 선언했고, 복사 연산자를 선언하지 않았지만 복사 연산자가 쓰인다면 컴파일러는 복사 연산자를 작성한다.
- 복사 연산자를 선언했고, 복사 생성자를 선언하지 않았지만 복사 생성자가 쓰인다면 컴파일러는 복사 생성자를 작성한다.
이동 연산 자동 작성 조건
- 클래스에 어떤 복사 연산도 선언되어 있지 않다.
- 클래스에 어떤 이동 연산도 선언되어 있지 않다.
- 클래스에 소멸자가 선언되어 있지 않다.
기본 연산 활성화
- C++11에서는 기본 행동을 사용하겠다는 의사를 “= default”를 이용해서 명시적으로 표현할 수 있다.
class widget
{
public:
~widget(); // 사용자 선언 소멸자
widget(const widget&) = default; // 기본 복사 생성자
widget& operator=(const widget&) = default; // 기본 복사 연산자
};
- 다형적 기반 클래스에는 가상 소멸자가 있는데 복사 연산과 이동 연산 모두 기본 행동이 필요할때 “= default”를 지정하면 된다.
class base
{
pubilc:
virtual ~base() = default; // 가상 소멸자
base(base&&) = default; // 기본 이동
base& operator=(base&&) = default;
base(const base&) = default; // 기본 복사
base& operator=(const base&) = default;
};
C++11 의 특별한 멤버 함수 규칙
기본 생성자
- C++98 의 규칙들과 같다.
- 클래스에 사용자 선언 생성자가 없는 경우에만 자동으로 작성된다.
소멸자
- C++98 의 규칙들과 같다.
- 기본적으로 noexcept 이다.
- 기반 클래스 소멸자가 가상일 때에는 자동 작성되는 소멸자도 가상이다.
복사 생성자
- 실행시점 행동은 C++98 과 같다.
- 비정적 자료 멤버들은 멤버별로 복사 생성한다.
- 클래스에 사용자 선언 복사 생성자가 없을 때에만 자동으로 작성된다.
- 클래스에 이동 연산이 하나라도 선언되어 있으면 삭제된다.
- 사용자 선언 복사 연산자나 소멸자가 있는 클래스에서 이 함수가 자동 작성되는 기능은 비권장이다.
복사 연산자
- 실행시점 행동은 C++98 과 같다.
- 비정적 자료 멤버들을 멤버별로 복사한다.
- 클래스에 사용자 선언 복사 연산자가 없을 때에만 자동으로
- 클래스에 이동 연산이 하나라도 선언되어 있으면 삭제된다.
- 사용자 선언 복사 생성자나 소멸자가 잇는 클래스에서 이 함수가 자동 작성되는 기능은 비권장이다.
이동 생성자, 이동 연산자
- 비정적 자료 멤버의 멤버별 이동을 수행한다.
- 클래스에 사용자 선언 복사 연산들과 이동 연산들, 소멸자가 없을 때에만 작성된다.
댓글남기기