1 분 소요

특별한 멤버 함수들의 자동 작성 조건

  • 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 과 같다.
  • 비정적 자료 멤버들을 멤버별로 복사한다.
  • 클래스에 사용자 선언 복사 연산자가 없을 때에만 자동으로
  • 클래스에 이동 연산이 하나라도 선언되어 있으면 삭제된다.
  • 사용자 선언 복사 생성자나 소멸자가 잇는 클래스에서 이 함수가 자동 작성되는 기능은 비권장이다.

이동 생성자, 이동 연산자

  • 비정적 자료 멤버의 멤버별 이동을 수행한다.
  • 클래스에 사용자 선언 복사 연산들과 이동 연산들, 소멸자가 없을 때에만 작성된다.

댓글남기기