일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- virtual function
- 오블완
- Effective c++
- c++
- Smart Pointer
- 티스토리챌린지
- 영화
- 암시적 변환
- more effective c++
- lua
- reference
- 게임
- resource management class
- 참조자
- operator new
- exception
- std::async
- 언리얼
- universal reference
- 반복자
- 예외
- effective stl
- implicit conversion
- 상속
- 영화 리뷰
- effective modern c++
- UE4
- 보편 참조
- 스마트 포인터
- iterator
- Today
- Total
목록전체 글 (241)
스토리텔링 개발자

항목 18. 소유권 독점 자원의 관리에는 std::unique_ptr를 사용하라 std::unique_ptrraw 포인터와 같은 크기라고 가정할 수 있다.대부분의 연산에서 raw 포인터와 동일한 명령들을 실행한다.독점적 소유권(exclusive ownership) 의미론을 토대로 구현되어 있다.널이 아닌 std::unique_ptr는 항상 자신이 가리키는 객체를 소유하고 있다.이동하면 소유권은 옮겨지고, 기존 포인터는 널로 설정된다.소유권 문제로 복사는 허용되지 않는다.즉, 이동 전용 타입(move-only type)이다.두 가지 타입이 존재한다.개별 객체를 위한 타입(std::unique_ptr)operator[] 를 제공하지 않는다.배열을 위한 타입(std::unique_ptr)operator*와..
항목 17. 특수 멤버 함수들의 자동 작성 조건을 숙지하라 특수 멤버 함수(special member function)C++이 자동으로 작성하는 멤버 함수꼭 필요한 경우에만 자동으로 작성된다.인수를 받는 생성자만 명시적으로 선언된 클래스엔 기본 생성자가 작성되지 않는다.작성된 특수 멤버 함수들은 암묵적으로 inline public nonvirtual이다.가상 소멸자가 있는 기본 클래스를 상속받으면 소멸자는 가상으로 선언된다.C++98에서는...기본 생성자, 소멸자복사 생성자복사 할당 연산자C++11에서는 두 가지가 추가되었다.이동 생성자(move constructor)이동 할당 연산자(move assignment operator)class Widget{public: ... Widget(Wi..

항목 16. const 멤버 함수를 스레드에 안전하게 작성하라 const 함수를 가지는 다항식(polynomial) 예제class Polynomial{public: // 다항식의 근들 // 즉, 다항식이 0으로 평가되는 값들 using RootsType = std::vector; RootsType roots() const // 캐시된 값을 그저 리턴 { if(!rootsAreValid) { ... // 근들을 계산해서 rootVals에 캐싱 rootsAreValid = true; } return rootVals; }private: m..
항목 15. 가능하면 항상 constexpr을 사용하라 constexpr 개요객체에 적용하면 const의 강화된 버전처럼 작용한다.어떠한 값이 상수인데다 컴파일 시점에 알려지게 한다.허나 함수에 적용하면 상당히 다른 의미로 작용한다.결과값이 반드시 const가 아니다.심지어 반드시 컴파일 시점에 알려진다는 보장도 없다.결함이 아닌 의도된 기능이다.(심지어 위 두 성질은 constexpr의 장점이다.) constexpr 객체constexpr 객체는 실제로 const이며, 그 값은 실제로 컴파일 시점에 알려진다.컴파일 시점에 알려지는 값에는 특별한 권한이 있다.읽기 전용 메모리에 배치될 수 있다.C++에서 정수 상수 표현식(integral constant expression)이 요구되는 문맥에서 사용..
항목 14. 예외를 방출하지 않을 함수는 noexcept로 선언하라 C++98의 예외 명세함수의 구현을 수정하면 예외 명세도 바뀌는 상황이 잦았다.클라이언트 코드가 깨질 수 있다.호출자가 원래의 예외 명세에 의존할 수도 있기 때문이다.컴파일러는 함수 구현과 예외 명세, 클라이언트 코드 사이의 일관성 유지에 아무런 도움도 안 됐다.결국 C++98의 예외 명세는 득보다 실이 크게 느껴졌다. C++11의 예외 명세자세한 예외 지정보다는 예외를 하나라도 방출하는지 여부가 더 중요한 게 아닌가?noexcept 키워드를 사용할 수 있게 되었다.C++98의 예외 지정은 비권장(deprecate) 기능으로 분류되었다. noexcept의 장점호출 코드의 예외 안정성이나 효율성을 증진시킬 수 있다.컴파일러가 더 나..
항목 13. iterator보다 const_iterator를 선호하라 const_iteratorconst_iterator는 수정하면 안되는 값들을 가리킨다.가능한 한 const를 사용하라는 표준 관례는 반복자에도 적용된다.허나 C++98에서는 이게 쉽지 않았다.(EC++ 항목 26 참조)std::vector values;...std::vector::iterator it = std::find(values.begin(), values.end(), 1983);values.insert(it, 1998);위 코드에서의 반복자는 전혀 수정되지 않으므로 const_iterator면 좋겠다.하지만 C++98에서는 간단하지 않다.typedef std::vector IterT;typedef std::vector::co..
항목 12. 재정의 함수들을 override로 선언하라 가상 함수 재정의파생 클래스 함수를 기반 클래스의 인터페이스를 통해 호출할 수 있게 만드는 매커니즘class Base{public: virtual void doWork(); ...};class Derived : public Base{public: virtual void doWork(); ...};std::unique_ptr upb = std::make_unique();...upb->doWork(); // 기본 클래스의 인터페이스로 파생 클래스의 함수가 호출된다.재정의를 위한 필수 조건기본 클래스 함수가 반드시 가상함수여야 한다.함수 이름이 반드시 동일해야 한다.(소멸제는 예외)함수의 매개변수 타입이 반드시 동일해야 한다.함수..
항목 11. 정의되지 않은 private 함수보다 삭제된 함수를 선호하라 코드의 특정 함수를 호출하지 못하도록 하기그냥 그 함수를 선언하지 않는다.특수 멤버 함수들에서는 그게 쉽지 않다.즉, C++이 필요에 따라 자동으로 작성하는 멤버 함수들.예를 들면 복사 생성자, 복사 대입 연산자.C++98에서의 접근 방식해당 함수들을 private 선언하고 정의하지 않는다.private에 선언되어 있으므로 호출할 수 없다.정의하지 않았으므로 호출 시 링크 실패한다.C++98 표준 입출력 스트림 객체는 복사를 방지하도록 구현되어 있다.template >class basic_ios : public ios_base{public: ...private: basic_ios(const basic_ios&); //..