소개
c++11의 변화의 폭은 매우 크다
- auto선언, 범위 기반 for 루프, 람다 표현식, 오른값 참조 등등..
- 새로운 동시성 기능
- nullptr와 별칭 선언 등장
- 스마트 포인터
- 객체 이동
이 책은 c++11과 c++14의 기능들 자체가 아니라, 그 기능들의 효과적인 적용 방법을 서술하는 데 전념
c++11에서 가장 널리 쓰이는 기능은 아마 이동 의미론(move semantics)
- 오른값(rvalue)에 해당하는 표현식과 왼값(lvalue)에 해당하는 표현식이 구분됨
- 오른값은 이동 연산이 가능한 객체를 가리키지만, 왼값은 일반적으로 그렇지 않음
- 일반적으로, 주소를 취할 수 있다면 왼값, 없다면 오른값
함수 호출의 맥락에서,
- 인수(argument): 함수에 전달한 표현식
- 매개변수(parameter): 인수에 의해 초기화되는 값
- 매개변수는 왼값이지만, 인수는 왼값일 수도 오른값일 수도 있다. 이 점은 완벽전달(perfect forwarding)과정에서 특히나 중요하다.(항목 30 참고)
예외 안전
- 잘 설계된 함수는 예외에 안전하다 - 예외안전성(basic exception safety)
- 기본 보장(basic guarantee): 예외가 발생해도 프로그램의 불변식이 위반되지 않으며 자원지 새지 않을 것을 확신 할 수 있음
- 강한 보장(strong guarantee): 예외가 발생해도 프로그램의 상태가 함수 호출 이전 상태와 동일하게 유지될 것임을 확신 할 수 있음
함수 객체
- operator() 멤버 함수를 지원하는 형식의 객체
- 함수처럼 행동하는 객체
- 때에 따라서는 비멤버 함수의 호출 구문'함수이름(인수들)' 형태를 이용해서 실행할 수 있는 모든 것을 뜻하는 좀 더 넓은 의미로도 쓰임
- 좀 더 넓은 의미의 함수 객체는 c스타일의 함수 포인터도 포함
- 이러한 세세한 구분은 무시하고, 함수 객체와 호출 가능 객체라는 것이 그냥 함수 호출 구문을 이용해서 실행할 수 있는 무엇이라고만 생각해도 무방
클로저(closure)
- 람다 표현식을 통해 만들어진 함수 객체
- 이 책에서는 둘을 그냥 람다(lambda)라고 칭함
- 마찬가지로 함수 템플릿과 템플릿 함수를 구분하는 경우는 드뭄
- 클래스 템플릿과 템플릿 클래스도 마찬가지
정의는 선언의 요건들도 갖추고 있으므로, 이 책에서는 정의라는 점이 아주 중요한 경ㅇ가 아닌 한 그냥 선언이라는 용어를 사용하겠음
함수의 서명(signature)
- 이 책에서 함수의 서명이 함수의 선언 중 매개변수 형식들과 반환 형식을 지정한 부분이라고 정의한다.
- 예) bool(const Widget&)
- noexcept이나 constexpr과 같은 부분도 서명에 포함되지 않음
- 이러한 정의는 '서명'의 공식적인 정의와는 조금 다르지만, 적어도 책의 목적에서는 이 정의가 더 유용하다
미정의 행동(undefined behavior)
- 실행시점(runtime)에 행동을 예측할 수 없다는 뜻
포인터
- 생 포인터: new가 돌려주는 포인터 같은 내장(built-in) 포인터
- 똑똑한 포인터(smart pointer): 생 포인터의 반대 개념으로 사용
dtor: 소멸자(destructor)
'공부 > 개발독서 - c++, c#' 카테고리의 다른 글
[effective C#] 1장 C# 언어 요소 (아이템 8 ~ 10) (0) | 2022.04.24 |
---|---|
[effective C#] 1장 C# 언어 요소 (아이템 5 ~ 7) (0) | 2022.04.17 |
[effective C#] 1장 C# 언어 요소 (아이템 1 ~ 4) (0) | 2022.04.10 |