본문 바로가기

Programming/CPP11&14

[C++11] default와 delete 키워드

반응형

C++의 클래스는 기본적으로 다음의 특수한 멤버 함수를 생성합니다.

기본 생성자
복사 생성자
복사 대입 연산자
소멸자

클래스를 생성하고 아무것도 하지 않아도 위의 4개는 기본적으로 생성됩니다.

이것으로 클래스는 기본적으로 아무것도 추가하지 않아도 생성, 복사, 소멸이 가능해집니다.

C++11에서는 기본적으로 생성되는 특수 멤버 함수에 무브 생성자무브 대입 연산자가 추가되었습니다.

이 특수한 멤버 함수들을 명시적으로 선언하면 다음과 같은 규칙이 발생합니다.

1. 어떤 생성자(복사 생성자 포함)가 명시적으로 선언된 경우 기본 생성자는 자동적으로 생성되지 않는다.

2. 가상 소멸자가 명시적으로 선언된 경우 기본 소멸자가 자동적으로 생성되지 않는다.

3. 무브 생성자나 무브 대입 연산자가 명시적으로 선언된 경우

    1) 복사 생성자가 자동으로 생성되지 않는다.
    2) 복사 대입 연산자가 자동으로 생성되지 않는다.

4. 복사 생성자, 복사 대입 연산자, 무브 생성자, 무브 대입 연산자, 혹은 소멸자가 명시적으로 선언된 경우

    1) 무브 대입 연산자가 자동으로 생성되지 않는다.
    2) 무브 대입 연산자가 자동으로 생성되지 않는다.

추가적으로 C++11에서는 다음 규칙이 존재합니다.

5. 복사 생성자나 소멸자가 명시적으로 선언된 경우 복사 대입 연산자의 자동 생성이 되지 않는다.

6. 복사 대입 연산자나 소멸자가 명시적으로 선언된 경우 복사 생성자의 자동 생성이 되지 않는다.

다만 Visual Studio에서는 암시적으로 생성하기 때문에 호출해도 에러가 발생하진 않습니다.

다음 코드는 C++11 이전의 uncopyable 클래스를 보여줍니다.

noncopyable은 복사를 막는 클래스 구현입니다.

struct noncopyable
{
	noncopyable() {};

private:
	noncopyable(const noncopyable&);
	noncopyable& operator=(const noncopyable&);
};

기본 생성자는 기본적으로 생성되지만 복사 생성자가 선언되었기 때문에 명시적으로 정의해줘야 합니다.

그렇지 않으면 객체 생성이 불가능합니다.

이 코드에는 몇 가지 문제가 있습니다.

복사 생성자와 복사 대입 연산자를 private으로 숨겨야 하며 기본 생성자를 명시적으로 구현을 생성해야 합니다.

복사 생성자는 private이기 때문에 friend 클래스나 noncopyable의 멤버 함수에서는 사용이 가능합니다.

완전하게 가려진 것이 아닙니다.

C++11 버전의 noncopyable입니다.

struct noncopyable
{
	noncopyable() = default;
	noncopyable(const noncopyable&) = delete;
	noncopyable& operator=(const noncopyable&) = delete;
};

defaultdelete 키워드가 추가되어 있습니다.

default는 자동적으로 생성되지 않은 특수한 멤버 함수를 돌려놓습니다.

기본 생성자의 경우는 {}만 추가해도 복구가 가능하기 때문에 default가 번거로울 수 있습니다.

다만 기본 복사 생성자나 복사 대입 연산자의 경우는 default가 기본 구현까지 제공하기 때문에 더 편리합니다.

또한 복사를 막기 위해서 명시적으로 delete 키워드로 선언했습니다.

이렇게 하게 되면 가독성이 올라가며 또한 해당 함수를 완전히 삭제할 수 있습니다.

그렇기 때문에 호출이 아예 불가능하게 됩니다.

private으로 선언했을 때, friend 클래스나 멤버 함수가 호출이 가능하지만 완전히 삭제되면 그런 문제가 사라집니다.

boost의 noncopyable.hpp 파일을 첨부합니다.

헤더가 없어서 작동은 하지 않습니다.

다만 코드가 단순하고 위의 예제와 차이가 크게 나지 않기 때문에 쉽게 파악이 가능합니다.

C++11이 적용 가능할 경우에는 default와 delete를 사용하고 있는 것을 확인할 수 있습니다.

반응형