본문 바로가기
프로그래밍/C || CPP

[C++11] DEFAULT / DELETE 키워드 정리

by _BlankSpace 2018. 5. 2.

사실, 이번 포스팅에서는 DELETE 키워드만 정리하려고 하였으나, 해당 내용을 공부 하다 보니 DEFAULT도 같이 정리해야 한다는 것을 알 수 있었다.

그 이유는 아래에서 설명하겠다.


1. default 키워드는 무엇인가.


우선, 기본적으로 C++에서는 클래스를 만들 때, 자동으로 멤버 함수를 만들고 있다는 것을 알 것이다.


다음 예를 보자.

1
2
3
4
5
6
7
8
class ExDefault
{
private:
    int _size;
public:
    void setSize(int size) { _size = size; }
    int Size() { return _size; }
};
cs

예를 보면, 생성자나 소멸자는 따로 정의하지 않았다. 하지만, 클래스를 생성해보면, 큰 문제는 없을 것이다.

이렇게 자동으로 생성해주는 멤버 함수는 크게 4 종류가 있다.

  • 기본 생성자 (default constructor)
  • 소멸자 (destructor)
  • 복사 생성자 (copy constructor)
  • 복사 할당 연산자 (copy assignment)

그럼, default 키워드는 언제 사용 하는 걸까?

default는 기본 생성자로 명시적으로 지정하기 위한 키워드라고 생각하면 된다.


예를 보자.

1
2
3
4
5
6
7
8
#include <iostream>
 
class ExDefault
{
public:
    ExDefault(int size) { _size = size; }
    ExDefault() = default// 기본 생성자를 명시적으로 지정.
}
cs

7번 라인은 default 키워드를 이용하여 명시적으로 지정했다고 하였다.

그럼, 7번 라인이 없으면 어떻게 될까?


아래와 같이 컴파일할 때 에러가 나온다.

1
2
3
4
Ex1Class.cpp: In function ‘int main()’:
Ex1Class.cpp:19:15: error: no matching function for call to ‘ExDefault::ExDefault()’
     ExDefault ex2;
               ^
cs


따라서 default 키워드는 말 그대로 가장 기본이 되는 함수를 기본으로, 명시적으로 지정하는 키워드라고 할 수 있다.


2. delete 키워드는 무엇인가.


앞서, delete 키워드를 설명할 때, default도 같이 설명하는 것이 좋을 것 같다고 말했다.

그 이유는 상반된 동작이기 때문이다.


먼저, 다음 클래스를 정의하였다.

1
2
3
4
5
class ExDelete
{
public:
    ExDelete(int n) {};
};
cs


위의 클래스를 이용하여, 다음 코드를 구현하였다.

1
2
3
ExDelete ed1(5);        // 에러 안 남.
ExDelete ed2(12.32);    // 에러 안 남. 12로 자동으로 형변환 일어남.
ed1 = ed2;              // 컴파일러가 할당 연산자를 생성함.
cs

여기서도 default 생성자로 인해서, 에러가 나지 않는다.
하지만, default 생성자를 원하지 않을 경우가 있을 수 있다.
이럴 경우에 delete 키워드를 사용할 수 있다.

delete 키워드를 사용한 예를 보자.
1
2
3
ExDelete(int n) {};
ExDelete(float= delete;
ExDelete& operator=(const ExDelete&= delete;
cs

2, 3번 라인을 보면, float 자료형이나 할당 연산자를 delete한 것을 볼 수 있다.

이후, 다시 컴파일을 실행해보자.


1
2
3
4
5
6
7
8
ExDelete.cpp:14:23: error: call of overloaded ‘ExDelete(double)’ is ambiguous
     ExDelete ed2(12.32);    // 에러 안 남. 12로 자동으로 형변환 일어남.
                       ^
 
ExDelete.cpp:15:9: error: use of deleted function ‘ExDelete& ExDelete::operator=(const ExDelete&)’
     ed1 = ed2;      // 컴파일러가 할당 연산자를 생성함.
         ^
 
cs

이처럼 에러가 나는 것을 볼 수 있다.


이것이, c++11 에서 delete 키워드의 의도된 코드라고 할 수 있다.


실제 코드에서도 잊지 말고 사용해보도록 하자.


출처: http://www.bogotobogo.com/cplusplus/C11/C11_default_delete_specifier.php

        http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2210.html#%22default%22

댓글