사실, 이번 포스팅에서는 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 생성자를 원하지 않을 경우가 있을 수 있다.
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
'프로그래밍 > C || CPP' 카테고리의 다른 글
[C | C++] #define 매크로 상수, 함수 정리 (1) | 2018.05.10 |
---|---|
[C++] 인라인(inline) 함수를 알아보자! (0) | 2018.05.06 |
[STL] STL 반복자 정리 (iterator) (1) | 2018.04.29 |
[C++11] std::set 을 알아보자. (0) | 2018.04.29 |
[C++] 키워드 constexpr 알아보기 (5) | 2018.04.23 |
댓글