티스토리 뷰

 

Effective Modern 이펙티브 모던 C++

 

차례

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

 

Item 7: 객체 생성 시 괄호 ()와 중괄호 {}를 구분하라

기억해 둘 사항들

- 중괄호 초기화는 가장 광범위하게 적용할 수 있는 초기화 구문이며, 좁히기 변환을 방지하며, C++의 가장 성가신 구문 해석에서 자유롭다.
- 생성자 중복적재 해소 과정에서 중괄호 초기화는 가능한 한 std::initializer_list 매개변수가 있는 생성자와 부합한다(심지어 겉으로 보기에 그보다 인수들에 더 잘 부합하는 생성자들이 있어도).
- 괄호와 중괄호의 선택이 의미 있는 차이를 만드는 예는 인수 두 개로 std::vector<수치형식>을 생성하는 것이다.
- 템플릿 안에서 객체를 생성할 때 괄호를 사용할 것인지 중괄호를 사용할 것인지 선택하기가 어려울 수 있다.

 

 

Item 8: 0과 NULL보다 nullptr를 선호하라

리터럴 0은 int이지 포인터가 아니다. 포인터만 사용할 수 있는 위치에 0이 있으면 마지못해 그것을 null 포인터로 해석하긴 하지만, 이는 최후의 수단일 뿐이다. C++의 기본적인 방침은, 0은 int이지 포인터가 아니라는 것이다.

nullptr의 장점은 이것이 정수 형식이 아니라는 점이다. 사실 포인터 형식도 아니다. nullptr는 모든 형식의 포인터라고 생각하면 된다. nullptr의 실제 형식은 std::nullptr_t인데, std::nullptr_t 자체는 다시 "nullptr의 형식"으로 정의된다. std::nullptr_t는 모든 생 포인터 형식으로 암묵적으로 변환되며, 이 덕분에 nullptr은 마치 모든 형식의 포인터처럼 행동한다.

기억해 둘 사항들

- 0과 NULL보다 nullptr를 선호하라.
- 정수 형식과 포인터 형식에 대한 중복적재를 피하라.
 

Item 9: typedef보다 별칭 선언을 선호하라


기억해 둘 사항들

- typedef는 템플릿화를 지원하지 않지만, 별칭 선언은 지원하다.
- 별칭 템플릿에서는 "::type" 접미어를 붙일 필요가 없다. 템플릿 안에서 typdef를 지칭할 때에는 "typename" 접두사를 붙여야 하는 경우가 많다.
- C++14는 C++11의 모든 형식 특질 변환에 대한 별칭 템플릿들을 제공한다.

 

 

Item 10:  범위 없는 enum보다 범위 있는 enum을 선호하라


기억해 둘 사항들

- C++98 스타일의 enum을 이제는 범위 없는 enum이라고 부른다.
- 범위 있는 enum의 열거자들은 그 안에서만 보인다. 이 열거자들은 오직 캐스팅을 통해서만 다른 형식으로 변환된다.
- 범위 있는 enum과 범위 없는 enum 모두 바탕 형식 지정을 지원한다. 범위 있는 enum의 기본 바탕 형식은 int이다. 범위 없는 enum에는 기본 바탕 형식이 없다.
- 범위 있는 enum은 항상 전방 선언이 가능하다. 범위 없는 enum은 해당 선언에 바탕 형식을 지정하는 경우에만 전방 선언이 가능하다.

 

 

참고

예제, https://github.com/BartVandewoestyne/Effective-Modern-Cpp
std::initializer_list, http://en.cppreference.com/w/cpp/utility/initializer_list
Andrzej's C++ blog: Intuitive interface — Part I, https://akrzemi1.wordpress.com/2013/06/05/intuitive-interface-part-i/

 

- James Song

댓글