티스토리 뷰
C++/Effective Modern C++
[Effective Modern C++] 항목 11. 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라
pppgod 2019. 10. 7. 22:01제목만 보면 내용이 어려워보일수 있는데 사실은 어렵지 않다. 다시 정리해보면 private 를 이용해 함수를 숨기지 말고 delete 키워드를 사용하라는 의미이다. 이렇게 고의적으로 함수를 없애는 경우는 우리가 많이 사용하는 싱글턴이나 팩토리 패턴들을 사용하는 경우이니 알아두는것이 좋다. 어떻게 다른지 예제를 보자.
class MyObject {
// private을 사용하는 경우
private:
MyObject();
// delete 키워드를 사용하는 경우
public:
MyObject() = delete;
};
여기서 delete 키워드를 사용한 경우에 public으로 사용한 것을 볼 수 있는데 이는 의도적으로 더 나은 오류 메시지를 받기 위함임을 알아두길 바란다.
위의 두 코드의 목적은 똑같다. 외부에서 객체를 생성하지 못하도록 의도적으로 가린것이다. 그러나 두가지 경우에 큰 차이가 있다.
차이점
friend
friend 를 사용하게 되면 private 은 소용이 없게된다. 외부에서 해당 함수에 접근 할 수 있게 되는 것이다. 즉 우리가 의도한것과는 달리 해당 함수를 사용할 수 있게 된것이다. 그러나 delete 키워드를 사용하면 어떠한 방법으로든 해당 함수를 사용할 수 없다.
멤버함수 사용 여부
private 은 모두가 알다시피 class 에만 사용할 수 있다. 그러나 delete 의 경우에는 private 이 아니라도 사용이 가능하다. 덕분에 template 을 사용한 경우에도 사용이 가능하다. 아래의 예제를 보자.
class Widget {
public:
template<typename T>
void processPointer(T* ptr)
{ ... }
};
template<>
void processPointer<void>(void*) = delete;
클래스 안에는 같은 이름과 같은 매개변수를 갖는 함수를 사용할 수 없다. 그러나 delete 를 사용하면 이런 걱정을 할 필요 없이 특정 매개변수를 사용하지 못하게 막을 수 있다.
참고 서적
스콧 마이어스, Effective Modern C++
'C++ > Effective Modern C++' 카테고리의 다른 글
[Effective Modern C++] 항목 13. iterator보다 const_iterator를 선호하라 (0) | 2019.10.20 |
---|---|
[Effective Modern C++] 항목 12. 재정의 함수들을 override로 선언하라 (0) | 2019.10.07 |
[Effective Modern C++] 항목 10. 범위 없는 enum보다 범위 있는 enum을 선호하라 (0) | 2019.09.28 |
[Effective Modern C++] 항목 9. typedef보다 별칭 선언을 선호하라 (0) | 2019.09.28 |
[Effective Modern C++] 항목 7. 객체 생성 시 괄호(())와 중괄호({})를 구분하라 (0) | 2019.09.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- async
- Override
- Perfect
- Unreal
- forward
- 보편참조
- C++
- const
- 포인터
- detach
- thread
- 보편 참조
- auto
- Effective Modern C++
- MOVE
- 람다
- std::forward
- Effective
- C
- 발아시기
- Overloading
- 다이소
- Modern
- std::move
- Forwarding
- C++11
- CPP
- C++14
- Join
- Future
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함