일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Smart Pointer
- 암시적 변환
- resource management class
- 언리얼
- virtual function
- 참조자
- reference
- 게임
- 예외
- effective stl
- exception
- 오블완
- 함수 객체
- more effective c++
- effective modern c++
- 영화 리뷰
- 비교 함수 객체
- lua
- 스마트 포인터
- 상속
- 다형성
- UE4
- operator new
- 티스토리챌린지
- 반복자
- Effective c++
- 영화
- implicit conversion
- 메타테이블
- c++
- Today
- Total
목록Effective C++/Effective Modern C++ (8)
스토리텔링 개발자
항목 8. 0과 NULL보다 nullptr을 선호하라 0과 NULL리터럴 0은 int이다.포인터만 사용할 수 있는 위치에 0을 사용하면 암시적 변환으로 널 포인터로 해석하긴 하지만, 기본은 int.즉, 포인터가 아니다.NULL 역시 마찬가지다.하지만, NULL은 int 이외의 정수 타입(long)을 부여할 수도 있으므로 int라고 확신할 순 없다.아무튼 NULL 역시 포인터 타입이 아니다. C++98에서의 오버로딩 문제void f(int);void f(bool);void f(void*);f(0); // f(void*) 가 아닌 f(int)를 호출f(NULL); // f(void*) 가 아닌 f(int)를 호출하거나 컴파일 에러만일 NULL의 구현이 int가 아니라면 암시적 변환의 우선순위가 모두 ..
항목 7. 객체 생성 시 괄호와 중괄호를 구분하라 C++11에서의 객체 생성 구문int x(0); // 괄호로 초기화int y = 0; // 등호로 초기화int z{ 0 }; // 중괄호로 초기화int z = { 0 }; // 등호와 중괄호로 초기화// 대체로 중괄호만 사용한 구문과 동일하게 취급된다. 초기화와 할당등호를 사용하면 반드시 할당(assignment)이 일어난다는 것은 오해이다.초기화와 할당의 차이int 같은 내장 타입에서는 차이가 없다.사용자 정의 타입에서는 각자 다른 함수를 호출한다.(생성자, operator=)Widget w1; // 기본 생성자를 호출Widget w2 = w1; // 복사 생성자를 호출w1 = w2; // 할당; 복사 할당 연산자(operator=)를 호출 유..
항목 6. auto가 원치 않은 타입으로 추론될 때에는 명시적 타입의 초기치를 사용하라 auto 타입 추론 실패 상황std::vector features(const Widget& w);Widget w;...// 기존 처리bool highPriority = features(w)[5];processWidget(w, highPriority);// auto를 사용한다면..// 컴파일은 여전히 성공한다.auto highPriority = features(w)[5];processWidget(w, highPriority); // 미정의 행동!auto 버전에서는 features(w)[5]의 타입이 bool이 아니기 때문이다.std::vector의 operator[]가 리턴하는 것은 std::vector::refer..
항목 5. 명시적 타입 선언보다는 auto를 선호하라 auto를 사용하는게 좋은 상황들// 1.int x;// 깜빡 잊고 초기화하지 않았다!// 2.templatevoid dwim(It b, It e){ for(; b != e; ++b) { typename std::iterator_traits::value_type currValue = *b; ... }}// 반복자가 가리키는 값의 타입이 지나치게 길다.// 3.// 클로저의 타입으로 지역 변수를 선언해보자.// 클로저의 타입은 컴파일러만 알고 있으므로 명시적으로 지정하는 것은 애초에 불가능하다.. 해결// 1.int x1; // 문맥에 따라 초기화되지 않을 수 있다.auto x2; // 컴파일 에러auto..
항목 4. 추론된 타입을 파악하는 방법을 알아두라 추론 타입 확인 방법 세 가지코드를 작성, 수정하는 시점(IDE 편집기)컴파일 시점(컴파일 에러를 통한 확인)런타임 시점(코드 삽입을 통한 타입 정보 출력) IDE 편집기프로그램 개체(변수, 매개변수, 함수 등) 위에 마우스 커서를 올리면 그 개체의 타입을 표시해 주는 것이 많다.IDE 안에서 C++ 컴파일러(혹은 컴파일러의 front가) 실행되기 때문에 가능한 것.그러므로 코드가 컴파일 될 수 있는 상태여야 한다.복잡한 타입의 경우 그리 도움이 되지 않을 수 있다. 컴파일러 에러 메시지일부러 문제를 발생시킨다면, 에러 메시지에는 그 문제를 일으킨 타입이 언급된다.// TD를 선언만 해둔다. TD는 "Type Dispalyer(형식 표시기)"를..
항목 3. decltype의 작동 방식을 숙지하라 decltype주어진 이름이나 표현식의 타입을 알려준다.하지만 가끔 예상 밖의 결과를 제공하기도 한다.C++11에서는 함수의 리턴 타입을 매개변수 타입들로 추론해야 하는 함수 템플릿을 선언할 때 주로 사용한다. decltype의 예측할 수 있는 결과const int i = 0;// decltype(i) = const intbool f(const Widget& w);// decltype(w) = const Widget&// decltype(f) = bool(const Widget&)struct Point{ int x, y;};// decltype(Point::x) = int// decltype(Point::y) = intWidget w;//de..
항목 2. auto의 형식 연역 규칙을 숙지하라 auto와 template의 타입 추론한 가지 기이한 예외를 제외하면, auto 타입 추론이 곧 템플릿 타입 추론이다.// 템플릿 타입 추론// expr과 ParamType의 타입을 통해 T를 추론한다.templatevoid f(ParamType param);f(expr); // 함수 실행// auto 타입 추론// auto : T와 동일한 역할// 변수의 타입 지정자(type specifier) : ParamType과 동일한 역할// 각각 아래의 주석 코드의 템플릿 타입 추론과 동일하다.auto x = 27; // 타입 지정자 : auto// template// void func_for_x(T param);// func_for_x(27);const a..
항목 1. 템플릿 형식 연역 규칙을 숙지하라 auto의 타입 추론모던 C++의 강력한 기능 중 하나인 auto는 템플릿 타입 추론을 기반으로 작동한다.즉, C++98에서 템플릿 타입 추론에 만족했다면, auto 역시 만족할 것이다.하지만, auto는 템플릿에 비해 덜 직관적일 때가 왕왕 있다.그러므로 우선 템플릿 타입 추론 규직을 잘 짚어볼 필요가 있다. 템플릿의 타입 추론templatevoid f(ParamType param);f(expr); // 어떤 표현식으로 f를 호출컴파일러는 expr(표현식)을 이용해서 두 가지 타입을 추론한다.T 타입ParamType 타입위의 두 타입은 같을 수도 있지만, 보통은 다르다. 아래의 예제로 명확해진다.templatevoid f(const T& param);..