posted by REDFORCE 2017. 3. 22. 23:09

목차


1. Auto

2. range based for

3. enum class

4. non-static data member initializers

5. initializer lists

6. default / delete definition

7. override / final

8. emplacement

9. constexpr

10. lambda

11. random

12. thread


이번 글에서는 [6편] dafault / delete definition 에 대해서 살펴보도록 하겠습니다.


6. default / delete


default : 컴파일러가 함수를 자동으로 생성하도록 명시적으로 지정

delete : 컴파일러가 함수를 자동으로 생성하지 않도록 명시적으로 지정


class TEST
{
public:
TEST() = default;
TEST(const TEST&) = default;
~TEST() = default;
TEST& operator= (const TEST&) = default;
};
class TEST2
{
public:
TEST2(const TEST2&) = delete;
TEST2 operator= (const TEST2&) = delete;
void* operator new(size_t) = delete; //blocking ( new operator )
};

위의 코드를 살펴보면 class TEST의 생성자와 소멸자는 default로 명시를 하는 것을 볼 수 있습니다.

default로 명시가 되었기 때문에 class TEST의 내용은 컴파일러가 함수를 자동으로 생성하게 됩니다.




반대로 class TEST2는 delete로 함수들이 명시적으로 지정되어 있습니다.

그리고 생성자와 void* operator new(size_t) = delete; 가 정의되어 있는 관계로

new 연산자를 이용한 할당이 블로킹 되어 있습니다.


두 번째 예로 다음 코드를 보도록 하겠습니다.


struct TEST
{
void func(int i) { std::cout << i << std::endl; }
void func(double d) = delete;
}
int main()
{
int i = 11;
TEST test;
test.func(i);
double d = 11.0;
test.func(d); // <<<<< Error!!
return 0;
}


간단히 struct 안에 func(double d) 함수 선언하고 delete로 지정을 하였습니다.

그리고 main에서 func( double d )  함수를 사용하려고 했지만!


Error가 빰빠카밤~ 하고 나오는걸 볼 수 있으실 겁니다.



아그럼 default는 자동으로 생성하는데 뭘해준다는거야?


라고 궁금해 하실까봐.

(사실 아 그냥 대충써... 하고 귀차니즘 발동하려다가 더 보충해봅니다..)


이번엔 default에 대한 예를 적어 보겠습니다.


class MyTest
{
public:
MyTest() { }
private:
MyTest(const MyTest&);
};
int main()
{
MyTest mt;
return 0;
}


위 코드를 보면 MyTest 클래스에서 기본적인 MyTest() 생성자가 기본으로 있습니다.

보통 기본 생성자는 우리가 따로 선언/정의를 해주지 않아도 컴파일러가 몰래 쓰담쓰담 만드는 게 상식입니다.


그렇다면 아래와 같이 코드를 바꾸면 어떻게 될까요?


class MyTest
{
private:
MyTest(const MyTest&);
};
int main()
{
// Compile error : C2512: 'MyTest'
MyTest mt; //Where is basic construct!!?
}


당연히 기본 생성자를 직접 선언도 안했을 뿐더러 다른 생성자를 만들었기 때문에

기본 생성자가 만들어지지 않습니다.


따라서 당연히 컴파일 에러가 빠밤~ 하고 나오게 되조.


이때 편하게 쓰는게 바로 default 입니다.


class MyTest
{
public:
MyTest() = default;
private:
MyTest(const MyTest&);
};
int main
{
MyTest mt;
}


default로 기본 생성자를 명시해줬기 때문에 딱히 정의를 안하더라도 컴파일러가 자동으로 생성해주게 됩니다.

이런식으로 활용하는 것이 default 입니다~



딱히 default 자체는 많이 쓸일이 없을 것 같습니다만.


delete는 유용하게 활용이 가능하겠더군요.



그럼 다음 7편에 override와 final에 대해서 뵙도록 하겠습니다~