생성자를 명시 적으로 삭제하는 이유는 무엇입니까?
생성자를 언제 / 왜 명시 적으로 삭제해야합니까? 그 이유가 사용을 막기 위함이라고 가정하면, 왜 그렇게하지 private
않습니까?
class Foo
{
public:
Foo() = delete;
};
감사!
어때 :
//deleted constructor
class Foo
{
public:
Foo() = delete;
public:
static void foo();
};
void Foo::foo()
{
Foo f; //illegal
}
대
//private constructor
class Foo
{
private:
Foo() {}
public:
static void foo();
};
void Foo::foo()
{
Foo f; //legal
}
그들은 기본적으로 다른 것들입니다. private
클래스의 멤버 만 해당 메서드를 호출하거나 해당 변수 (또는 친구)에 액세스 할 수 있음을 알려줍니다. 이 경우 static
해당 클래스 (또는 다른 멤버) 의 메서드가 클래스의 private
생성자 를 호출하는 것은 합법적입니다 . 삭제 된 생성자에는 적용되지 않습니다.
생성자를 명시 적으로 삭제하는 이유는 무엇입니까?
또 다른 이유 : 이니셜 라이저로 클래스를 호출하고 싶을 때
사용 delete
합니다. 런타임 검사없이 이것을 달성하는 매우 우아한 방법이라고 생각합니다.
C ++ 컴파일러가이 검사를 수행합니다.
class Foo
{
public:
Foo() = delete;
Foo(int bar) : m_bar(bar) {};
private:
int m_bar;
}
This - very simplified - code assures that there is no instantiation like this: Foo foo;
I've met with default ctors declared as 'deleted' in the source code of LLVM (in AlignOf.h for instance). The associated class templates are usually in a special namespace called 'llvm::detail'. The whole purpose there I think was that they considered that class only as a helper class. They never intended to instantiate them; only to use them within the context of other class templates with some metaprogramming tricks that run in compile time.
Eg. there's this AlignmentCalcImpl class template which is used only within another class template called AlignOf as a parameter for the sizeof(.) operator. That expression can be evaluated in compile time; and there's no need to instantiate the template -> so why not declare the default ctor delete to express this intention.
But it's only my assumption.
참고URL : https://stackoverflow.com/questions/13654927/why-explicitly-delete-the-constructor
'Nice programing' 카테고리의 다른 글
알림이 표시 될 때 사용자가 권한을 부여하려는 경우 Android '화면 오버레이 감지 됨'메시지 (0) | 2020.10.10 |
---|---|
Entity Framework- " 'Closure type'유형의 상수 값을 만들 수 없습니다…"오류 (0) | 2020.10.10 |
git fast-forwarding이란 무엇입니까? (0) | 2020.10.10 |
ADL이 함수 템플릿을 찾지 못하는 이유는 무엇입니까? (0) | 2020.10.10 |
Async await 키워드는 ContinueWith 람다와 동일합니까? (0) | 2020.10.10 |