옮긴이 머리말 xii
베타리더 후기 xiii
선정 가이드라인 목록 xvi
추천 서문(비야네 스트롭스트룹) xvii
시작하며 xix
감사의 글 xxiv
PART 1 사소한 것 때문에 중요한 문제를 놓치지 말자
CHAPTER 1.1 [P.2] ISO 표준 C++로 작성하라 3
__1.1.1 ISO 표준 C++란 무엇인가? 3
__1.1.2 차이를 캡슐화하기 5
__1.1.3 예전 방식 학습하기 9
__1.1.4 표준 개발 현황 파악하기 11
CHAPTER 1.2 [F.51] 선택의 여지가 있다면 오버로딩 대신 기본 인수를 사용하라 13
__1.2.1 소개 13
__1.2.2 추상화 다듬기: 추가 인수냐, 오버로딩이냐 14
__1.2.3 오버로드 확인의 미묘한 차이 16
__1.2.4 예제로 돌아가기 18
__1.2.5 모호하지 않다는 기본 인수의 특성 19
__1.2.6 오버로드의 대안 21
__1.2.7 반드시 오버로드해야 하는 경우 21
__1.2.8 요약 22
CHAPTER 1.3 [C.45] 데이터 멤버를 초기화하기만 하는 기본 생성자를 정의하지 말고 기본 멤버 초기화자로 초깃값을 설정하라 24
__1.3.1 어쨌거나 기본 생성자가 있는 이유는? 24
__1.3.2 데이터 멤버를 초기화하려면? 26
__1.3.3 두 사람이 클래스 하나를 유지보수하면 무슨 일이 발생하나요? 28
__1.3.4 요약 31
CHAPTER 1.4 [C.131] 자명한 getter와 setter는 피하라 32
__1.4.1 아주 오래된 이디엄 32
__1.4.2 추상화 33
__1.4.3 단순한 캡슐화 36
__1.4.4 클래스 불변 조건 39
__1.4.5 명사와 동사 41
__1.4.6 요약 42
CHAPTER 1.5 [ES.10] 선언당 단 하나의 이름만 선언하라 43
__1.5.1 소개합니다 43
__1.5.2 하위 호환성 47
__1.5.3 더 명확하게 선언하기 48
__1.5.4 구조적 바인딩 49
__1.5.5 요약 51
CHAPTER 1.6 [NR.2] 함수에 단일 반환문을 고집하지 말라 52
__1.6.1 규칙은 진화합니다 52
__1.6.2 정리를 보장하기 54
__1.6.3 RAII 사용하기 57
__1.6.4 좋은 함수 작성하기 59
__1.6.5 요약 61
PART 2 자기 발등을 찍지 말라
CHAPTER 2.1 [P.11] 지저분한 구조체는 코드에 펼쳐놓지 말고 캡슐화하라 65
__2.1.1 한 번에 처리하기 65
__2.1.2 지저분한 구조체를 캡슐화한다는 의미 67
__2.1.3 언어의 목적과 추상화의 본질 69
__2.1.4 추상화 수준 72
__2.1.5 리팩터링과 구분 짓기를 통한 추상화 74
__2.1.6 요약 75
CHAPTER 2.2 [I.23] 함수의 인수를 적게 유지하라 76
__2.2.1 얼마나 벌어야 할까요? 76
__2.2.2 추상화를 통해 문제를 단순화하기 78
__2.2.3 가능한 한 적게 하되, 덜 하지는 말기 81
__2.2.4 실제 사례 83
__2.2.5 요약 85
CHAPTER 2.3 [I.26] 크로스 컴파일러 ABI가 필요하면 C 방식의 하위 집합을 사용하라 86
__2.3.1 라이브러리 만들기 86
__2.3.2 ABI란 무엇인가? 87
__2.3.3 최소한으로 줄이기 89
__2.3.4 예외 전파 91
__2.3.5 요약 92
CHAPTER 2.4 [C.47] 멤버를 선언한 순서대로 데이터 멤버를 정의하고 초기화하라 94
__2.4.1 요약 103
CHAPTER 2.5 [CP.3] 쓰기 가능한 데이터의 명시적 공유는 최소화하라 104
__2.5.1 전통적 실행 모델 104
__2.5.2 잠깐, 더 있습니다 106
__2.5.3 교착 상태 및 데이터 경쟁 피하기 109
__2.5.4 잠금과 뮤텍스 외의 사항 111
__2.5.5 요약 114
CHAPTER 2.6 [T.120] 꼭 필요할 때만 템플릿 메타프로그래밍을 사용하라 115
__2.6.1 std::enable_if에서 requires로 123
__2.6.2 요약 128
PART 3 그만 사용하라
CHAPTER 3.1 [I.11] 절대로 원시 포인터(T*)나 참조(T&)로 소유권을 넘기지 말라 131
__3.1.1 자유 공간 사용하기 131
__3.1.2 스마트 포인터의 성능 비용 134
__3.1.3 데코레이터 없는 참조 시맨틱 사용하기 135
__3.1.4 gsl::owner 136
__3.1.5 요약 139
CHAPTER 3.2 [I.3] 싱글턴을 피하라 140
__3.2.1 전역 객체는 나쁩니다 140
__3.2.2 싱글턴 디자인 패턴 141
__3.2.3 정적 초기화 순서 실패 142
__3.2.4 싱글턴 숨기는 법 144
__3.2.5 하지만 이 중 하나만 존재해야 합니다 145
__3.2.6 잠깐만요... 147
__3.2.7 요약 149
CHAPTER 3.3 [C.90] memset과 memcpy에 의존하지 말고 생성자와 할당 연산자를 사용하라 150
__3.3.1 최대 성능 추구하기 150
__3.3.2 끔찍한 생성자 오버헤드 151
__3.3.3 가장 간단한 클래스 152
__3.3.4 어쨌든 표준에서 설명하는 내용은 무엇인가요? 155
__3.3.5 그러면 memcpy는 어때요? 158
__3.3.6 컴파일러를 절대 과소평가하지 말라 159
__3.3.7 요약 161
CHAPTER 3.4 [ES.50] const를 형 변환하지 말라 162
__3.4.1 이야기 162
__3.4.2 훨씬 더 많은 데이터 다루기 163
__3.4.3 상수 방화벽 165
__3.4.4 이중 인터페이스 구현 166
__3.4.5 캐싱과 느긋한 계산법 168
__3.4.6 두 종류의 const 169
__3.4.7 const의 놀라운 점 171
__3.4.8 요약 172
CHAPTER 3.5 [E.28] 전역 상태에 따른 에러 처리는 피하라(예: errno) 173
__3.5.1 에러 처리는 어렵습니다 173
__3.5.2 C와 errno 173
__3.5.3 반환 코드 175
__3.5.4 예외 176
__3.5.5 177
__3.5.6 Boost.Outcome 177
__3.5.7 에러 처리는 왜 이렇게 어려운가? 179
__3.5.8 고생 끝에 낙이 온다 180
__3.5.9 요약 182
CHAPTER 3.6 [SF.7] 헤더 파일의 전역 범위에 using namespace를 사용하지 말라 183
__3.6.1 이렇게 하지 말라 183
__3.6.2 명확하게 하기 184
__3.6.3 using 사용법 185
__3.6.4 심벌은 어디로 가나? 187
__3.6.5 한층 더 은밀히 퍼지는 문제 190
__3.6.6 복잡한 범위 지정 연산자 문제 해결하기 191
__3.6.7 유혹과 타락 193
__3.6.8 요약 194
PART 4 새로운 기능을 제대로 사용하라
CHAPTER 4.1 [F.21] ‘출력값’을 여러 개로 반환하려면 구조체로 반환하라 197
__4.1.1 함수 시그니처의 형태 197
__4.1.2 설명과 애너테이션 198
__4.1.3 이제 객체를 반환할 수 있습니다 199
__4.1.4 튜플도 반환할 수 있습니다 203
__4.1.5 비상수 참조로 전달 및 반환하기 205
__4.1.6 요약 209
CHAPTER 4.2 [Enum.3] 단순 열거형보다는 클래스 열거형을 택하라 210
__4.2.1 상수 210
__4.2.2 범위가 있는 열거형 213
__4.2.3 숨겨진 타입 215
__4.2.4 암묵적 형 변환 217
__4.2.5 요약 219
__4.2.6 추신 219
CHAPTER 4.3 [ES.5] 범위는 작게 유지하라 220
__4.3.1 범위의 본질 220
__4.3.2 블록 범위 222
__4.3.3 네임스페이스 범위 223
__4.3.4 클래스 범위 226
__4.3.5 함수 매개변수 범위 228
__4.3.6 열거형 범위 229
__4.3.7 템플릿 매개변수 범위 230
__4.3.8 맥락으로서의 범위 231
__4.3.9 요약 232
CHAPTER 4.4 [Con.5] 컴파일 타임에 계산할 수 있는 값은 constexpr를 사용하라 233
__4.4.1 const부터 constexpr에 이르기까지 233
__4.4.2 C++ 기본값 235
__4.4.3 constexpr 사용하기 237
__4.4.4 inline 241
__4.4.5 consteval 242
__4.4.6 constinit 243
__4.4.7 요약 245
CHAPTER 4.5 [T.1] 템플릿을 사용하여 코드의 추상화 수준을 높이라 246
__4.5.1 이야기 246
__4.5.2 추상화 수준 높이기 248
__4.5.3 함수 템플릿과 추상화 250
__4.5.4 클래스 템플릿과 추상화 253
__4.5.5 작명은 어렵습니다 255
__4.5.6 요약 256
CHAPTER 4.6 [T.10] 모든 템플릿 인수의 콘셉트를 명시하라 257
__4.6.1 어떻게 여기까지 왔을까요? 257
__4.6.2 매개변수 제한하기 260
__4.6.3 콘셉트를 추상화하는 법 263
__4.6.3 콘셉트를 통해 분해하기 266
__4.6.5 요약 268
PART 5 기본적으로 코드를 잘 작성하라
CHAPTER 5.1 [P.4] 프로그램은 최대한 정적으로 타입에 안전해야 한다 273
__5.1.1 타입 안전성은 C++의 보안 기능입니다 273
__5.1.2 공용체 275
__5.1.3 형 변환 277
__5.1.4 unsigned 280
__5.1.5 버퍼와 크기 283
__5.1.6 요약 285
CHAPTER 5.2 [P.10] 가변 데이터보다는 불변 데이터를 택하라 286
__5.2.1 잘못된 기본값 286
__5.2.2 함수 선언의 상수성 289
__5.2.3 요약 293
CHAPTER 5.3 [I.30] 규칙 위반을 캡슐화하라 294
__5.3.1 일상에서 보기 싫은 것 숨기기 294
__5.3.2 체면 차리기 296
__5.3.3 요약 301
CHAPTER 5.4 [ES.22] 값으로 초기화하기 전까지는 변수를 선언하지 말라 303
__5.4.1 표현식과 문의 중요성 303
__5.4.2 C 언어 방식의 선언 304
__5.4.3 선언 후 초기화하기 305
__5.4.4 최대한 지연된 선언 307
__5.4.5 맥락에 따른 기능의 지역화 309
__5.4.6 상태 제거하기 311
__5.4.7 요약 313
CHAPTER 5.5 [Per.7] 최적화할 수 있도록 설계하라 314
__5.5.1 프레임 레이트 최대화하기 314
__5.5.2 하드웨어 수준에서 더 나아가 작업하기 316
__5.5.3 추상화를 통한 최적화 320
__5.5.4 요약 322
CHAPTER 5.6 [E.6] 메모리 누수를 방지하려면 RAII를 사용하라 324
__5.6.1 결정론적 소멸 324
__5.6.2 파일 누수 없애기 327
__5.6.3 왜 굳이 이렇게 할까요? 330
__5.6.4 미래의 가능성까지 고려해야 하는가 332
__5.6.5 어디에서 얻을 수 있나요? 335
마치며 338
후기(허브 서터) 340
찾아보기 342