티스토리 뷰

 

Effective Modern 이펙티브 모던 C++

 

차례

1장. 형식 연역
2장. auto
3장. 현대적 C++ 적응하기
4장. 스마트 포인터
5장. 오른값 참조, 이동 의미론, 완벽 전달
6장. 람다 표현식
7장. 동시성 API
8장. 다듬기 

 

Item 11: 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라

정의되지 않은 비공개 함수(C++98)보다 삭제된 함수(C++11) 사용 시 장점

1. 멤버 함수 여부에 상관없이 어떤 함수도 삭제 가능

2. 원치 않는 템플릿 인스턴스화를 방지 

함수를 private으로 선언하되 정의를 생략하는 C++98의 관행은 C++11의 삭제된 함수가 제공하는 기능을 억지로 흉내 내는 것이었다. C++98의 접근방식은 클래스 바깥에서는 작동하지 않으며, 클래스 안에서도 항상 동작하지는 않는다. 작동한다고 해도 링크 시점에 가서야 작동하는 경우도 있다. 따라서 그냥 삭제된 함수를 사용하는 것이 낫다.

기억해 둘 사항들

- 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라.
- 비멤버 함수와 템플릿 인스턴스를 비롯한 그 어떤 함수도 삭제할 수 있다.

 

Item 12: 재정의 함수들을 override로 선언하라

재정의 함수들을 override로 선언 시 장점

1. 재정의를 의도한 함수가 실제로는 아무것도 재정의하지 않는다는 점을 컴파일러가 지적해 줌
2. 기반 클래스의 한 가상 함수의 서명을 변경했을 때 그 영향이 어느 정도인지 가늠하려 할 때에도 도움이 됨

한 멤버 함수에 참조 한정사가 붙어 있으면 그 함수의 모든 중복적재에도 참조 한정사를 지정해야 한다. 이는 참조 한정되지 않은 중복적재가 왼값 객체와 오른값 객체 모두에 대해 호출될 수 있기 때문이다. 그런 중복적재는 참조 한정된 중복적재들과 경쟁하며, 따라서 그 함수에 대한 모든 호출이 중의적인 호출로 변한다.

기억해 둘 사항들

- 재정의 함수는 override로 선언하라.
- 멤버 함수 참조 한정사를 이용하면 멤버 함수가 호출되는 객체(*this)의 왼값 버전와 오른값 버전을 다른 방식으로 처리할 수 있다.

Item 13: iterator보다 const_iterator를 선호하라

이 조언의 근본적인 동기는 const를 사용하는 것이 의미가 있는 경우에는 항상 const를 사용하는 것이 바람직하다는 것인데, 이 조언은 C++11 이전에도 참이었다. 그러나 C++98에서 반복자를 다룰 때에는 이 조언이 전혀 실용적이지 않았다. C++11에서는 두드러지게 실용적이며, C++14는 C++11에서 마무리하지 못한 몇 가지 단점까지 해결한다.

기억해 둘 사항들

- iterator보다 const_iterator를 선호하라.
- 최대한 일반적인 코드에서는 begin, end, rbegin 등의 비멤버 버전들을 해당 멤버 함수들보다 선호하라.

 

Item 14:  예외를 방출하지 않을 함수는 noexcept로 선언하라 

예외를 전혀 방출하지 않는 것이 자연스러운 구현인 함수들도 있으며, noexcept로 선언하면 최적화에 큰 도움이 되는 함수들도 많다(특히 이동 연산과 swap). 그런 함수들을 가능하면 noexcept로 구현하는 것은 가치 있는 일이다. 독자는 어떤 함수가 예외를 방출하지 않는다는 점을 확신할 수 있다면, 당연히 noexcept로 선언해야 한다.

기억해 둘 사항들

- noexcept는 함수의 인터페이스의 일부이다. 이는 호출자가 noexcept 여부에 의존할 수 있음을 뜻한다.
- noexcept 함수는 비noexcept 함수보다 최적화의 여지가 크다.
- noexcept는 이동 연산들과 swap, 메모리 해제 함수들, 그리고 소멸자들에 특히나 유용하다.
- 대부분의 함수는 noexcept가 아니라 예외에 중립적이다.

 

참고

예제, https://github.com/BartVandewoestyne/Effective-Modern-Cpp
C++ Exception Handling (예외 처리) 와 Stack Unwinding (스택 풀기), http://devluna.blogspot.kr/2015/02/c-exception-handling.html

 

- James Song

댓글