본문 바로가기

전체 글50

10.범위 없는 enum보다 범위 있는 enum을 선호하라. - C++98 스타일의 enum을 이제는 범위없는 enum이라고 부른다. C++98 스타일의 enum으로 선언된 열거자(enumerator)들에 대해서는 "한 중괄호 쌍 안에서 어떤 이름을 선언하면 그 이름의 가시성은 해당 중괄호 쌍이 정의하는 범위로 한정된다"는 일반적인 규칙이 적용되지 않는다. 그런 열거자 이름들은 enum을 포함하는 범위에 속하며, 따라서 그 범위에 같은 이름이 있으면 안 된다.이러한 이유로 C++98 스타일의 enum을 범위 없는(unscoped) enum이라고 부른다. enum Color { black, white, red }; // black, white, red는 // Color가 속한 범위에 속함 auto white = false; // 오류! 이 범위에 이미 // whit.. 2020. 12. 25.
9. typedef 보다 별칭 선언을 선호하라. - typedef는 템플릿화를 지원하지 않지만, 별칭 선언은 지원한다. STL 컨테이너들을 사용하다 보면 다음과 같은 타입을 흔히 만난다. std::unique_ptr 이런 타입을 여러 번 입력하고 싶지는 않을 것이다. 그냥 생각만 해도 손목 터널 증후군에 걸릴 것 같다. 이럴 때 사용할 수 있는 것이 typedef 이다. typedef std::unique_ptr UPtrMapSS; 그런데 typedef는 너무 C++98스러운 유물이다. C++11에서도 typedef가 작동하지만, C++11은 별칭 선언(alias declaration) 이라는 것도 제공한다. using UPtrMapSS = std::unique_ptr; typedef와 하는 일은 정확히 동일하다. 하지만 typedef보다 우월한 점이.. 2020. 12. 20.
8. 0과 NUll보다 nullptr을 선호하라. - 0과 NULL보다 nullptr을 선호하라. 요점부터 말하자면, 리터럴 0은 int이지 포인터가 아니다. 실용적인 관점에서는 NULL도 마찬가지이다. 그러나 NULL의 경우에는 다소 불확실한 세부사항이 존재한다. 구현이 NULL에 int 이외의 정수 타입을 부여할 수도 있기 때문이다. C++98에서 이 점이 이야기하는 주된 문제는 포인터와 정수 타입에 대한 오버로딩이 의외의 방식으로 해소된다는 점이었다. 0이나 NULL로 그런 오버로딩된 함수를 호출했을 때, 포인터를 받는 오버로딩된 함수가 호출되는 일은 없다. 반면 nullptr를 사용하면 오버로딩이 예상과 다르게 해소되는 일이 없다. 그 뿐만 아니라, nullptr는 코드의 명확성도 높여준다. 템플릿의 타입 추론시에도, 0과 NULL은 정수 타입으.. 2020. 12. 20.
7. 객체 생성시 괄호()와 중괄호{}를 구분하라. - 중괄호 추기화는 가장 광범위하게 적용할 수 있는 초기화 구문이며, 축소 변환을 방지하며, C++의 가장 성가신 구문 해석에서 자유롭다. 여러 가지 초기화 구문이 주는 혼동을 완화하기 위해, 그리고 그 구문들이 모든 가능한 초기화 시나리오를 포괄하지 않는다는 사실을 해결하기 위해, C++11은 균일 초기화를 도입했다. 균일 초기화 구문은 중괄호를 사용하며, 그래서 여기서는 균일화 초기화보다 중괄호 초기화라는 표현을 선호한다. 기존의 변수 초기화 방법에, 중괄호 초기화 방법을 더해 총 4가지의 방법으로 변수를 초기화할 수 있다. int a(0); // 초기치를 괄호로 감산 예 int b = 0; // 초기치를 "=" 다음에 지정한 예 int c{ 0 }; // 초기치를 중괄호로 감싼 예 int d = {.. 2020. 12. 20.