PROGRAMMING26 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. 6. auto가 원치 않은 타입으로 추론될 때에는 명시적 탕비의 초기치를 사용하라. - "보이지 않는" 프록시 타입 때문에 auto가 초기화 표현식의 타입을 "잘못" 추론할 수 있다. 예를 들어 예를 들어 std::vector::operator[]의 반환 타입은 bool&이 아니라 어떤 프록시 클래스(proxy class) 타입이다(Effective STL의 항목 18을 보자). 이러한 프록시(Proxy) 설계 패턴은 소프트웨어 설계 패턴 중 만신전(萬神殿 - Pantheon)을 아주 오래전부터 차지하고 있는 패턴 중 하나이다. 프록시 클래스 중에는 클라이언트에게 명백히 드러나도록 설계된 것들이 있다. std::shared_ptr와 std::unique_ptr가 좋은 예이다. 반면, 그 외의 프록시 클래스들은 다소 은밀하게 작동하도록(보이지 않도록) 숨겨져 있다. 대체로, "보이지 않는.. 2020. 12. 19. 5. 명시적 선언 보다는 auto를 선호하라. - auto 변수는 반드시 초기화해야하며, 이식성이나 효율성 문제를 유발할 수 있는 타입 불일치가 발생하는 경우가 거의 없으며, 대체로 변수의 타입을 명시적으로 지정할때 보다 타자량도 더 적다. auto는 반드시 초기화 해주어야 한다. int x1; // 문맥에 따라서는 초기화되지 않을 수 있음 auto x2; // 오류! 초기치가 꼭 필요함 auto x3 = 0; // 양호함: x3의 값이 잘 정의됨 반복자의 역반복자의 역참조를 통해 초기화되는 지역 변수 하나를 간단하게 선언해보자. template void dwim(It b, It e) { for (; b != e; ++b) { typename std::iterator_traits::value_type currValue = *b; } } auto를 사.. 2020. 12. 19. 이전 1 2 3 4 5 6 7 다음