일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 반복자
- exception
- 함수 객체
- 비교 함수 객체
- virtual function
- 다형성
- UE4
- more effective c++
- implicit conversion
- 스마트 포인터
- 암시적 변환
- reference
- resource management class
- 영화 리뷰
- 언리얼
- 예외
- effective stl
- 오블완
- 상속
- effective modern c++
- 티스토리챌린지
- lua
- c++
- operator new
- 영화
- Effective c++
- Today
- Total
목록분류 전체보기 (204)
스토리텔링 개발자
항목 28. 스마트 포인터(Smart Pointer) 스마트 포인터를 사용하는 이유생성과 소멸 작업을 조절할 수 있다.스마트 포인터가 생성되고 소멸되는 시기를 사용자가 결정할 수 있다.초기값을 스마트 포인터가 컨트롤하므로, 쓰레기값 문제가 없다.객체를 알아서 소멸시켜주므로 리소스 누수가 없다.복사와 대입 동작을 조절할 수 있다.스마트 포인터가 복사되고 대입될 때의 일을 사용자가 결정할 수 있다.깊은 복사와 얕은 복사를 원하는 대로 정의할 수 있다.혹은 복사 대입을 전혀 사용하지 못하도록 막을 수도 있다.역참조 동작을 조절할 수 있다.스마트 포인터가 가리키는 객체를 가져오려고 할 때 일어나는 일을 결정할 수 있다.지연 방식 데이터 / 명령어 가져오기(fetching)(항목 17 참조) 스마트 포인터..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/0V9x9/btsJsxApEHd/ebd5wMxauZUKIryosXCLwk/img.png)
항목 27. 힙(heap)에만 생성되거나 힙에는 만들어지지 않는 특수한 클래스를 만드는 방법 객체가 힙에만 생성되게 하기암시적 객체 생성 / 소멸(변수 선언에 의해 생성자가 자동으로 호출되고 유효범위의 종료에 의해 소멸자가 호출되는 것)을 불법화 시킨다.생성자와 소멸자를 private로 선언한다.생성자를 private화 하는 건 너무 과한 감이 있다. 만약 기존의 것에 적용한다면 인터페이스를 과하게 해친다.그래도 생성자를 private로 하고자 한다면 큰 단점이 있는데..너무 많은 생성자를 고려해야 한다는 점이다.컴파일러가 자동 생성하는 생성자는 public이기 때문이다.소멸자만 private로 선언한다.유사 소멸자(소멸자 기능을 담는 함수)를 만들어서 객체를 소멸시킬 때는 이 유사 소멸자를 호출하도..
항목 26. 클래스 인스턴스의 개수를 의도대로 제한하는 방법 개수 제한의 예시프린터. 프린터 객체는 갯수 제한을 할 수밖에 없을 것이다. 객체 개수를 0개로 제한클래스의 생성자를 private 선언한다.class CanBeInstantiated{private: CanBeInstantiated(); CanBeInstantiated(const CantBeInstantiated&); ...}; 객체 개수를 1개로 제한객체를 생성자 함수 안에 그냥 넣는다.class PrintJob;class Printer{public: void submitJob(const PrintJob& job); void reset(); void performSelfTest(); ... ..
항목 25. 생성자 함수와 비멤버 함수를 가상 함수처럼 만드는 방법 가상 생성자(virtual constructor) : 생성자 함수를 가상 함수처럼런타임에 타입을 체크하겠다(가상) + 명확한 타입의 객체에 대한 메모리 할당(생성자) 가 어떻게 양립 가능할까?하지만 가능한 일이다. 게다가 비일비재하게 사용한다.class NLComponent // 추상 기본 클래스{public: ... // 순수 가상 함수가 최소한 하나는 있다.};// 순수 가상 함수가 없는 하위 클래스들class TextBlock : public NLComponent { ... };class Graphic : public NLComponent { ... };class NewsLetter // 뉴스레터{public: New..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ct6pT5/btsJnn6hTSt/n0WK1mCwB33sRuksjPULik/img.png)
항목 24. 가상 함수, 다중 상속, 가상 기본 클래스, RTTI에 들어가는 비용을 제대로 파악하자 가상 함수C++ 언어는 어떻게 구현되었느냐에 따라 객체의 크기와 멤버 함수의 속도가 현저히 변한다.그 중 가장 큰 영향을 끼친다고 볼 수 있는 것이 바로 가상 함수이다.가상 함수는 가상 테이블(vtbl, virtual table) 및 가상 테이블 포인터(vptr, virtual table pointer)로 구현한다.그리고 이 두 가지가 성능에 가장 큰 쟁점이 된다. 가상 테이블(vtbl, virtual table)가상 함수를 포함하는 클래스가 가지는 함수 포인터의 배열을 말한다.가상 함수를 선언 혹은 상속받은 클래스(클래스 인스턴스가 아님!)에 반드시 생긴다.가상 테이블은 해당 클래스의 가상 함수 함..
항목 23 : 정 안되면 다른 라이브러리를 사용하자! 라이브러리 설계의 타협이상적인 라이브러리란?작고, 빠르고, 강력하고, 유연하고, 확장 가능하고, 직관적이고, 어디든 쓸 수 있고, 플랫폼 지원이 좋아야 하고, 사용상의 제약에 대해 자유롭고, 버그도 없어야 한다.하지만 이 모든 걸 만족시키는 라이브러리란 있을 수가 없다.각각은 트레이트 오프가 있다.크기, 실행속도 / 이식성많은 기능 / 직관성 우선순위가 다른, 비슷한 기능의 라이브러리iostream / stdio둘 다 입출력 라이브러리지만, 구현과 성능상의 차이점이 있다.iostream의 장점타입 안정성확장성stdio의 장점속도// stdio 버전scanf("%1f", &d);printf("%10.5f", d);// iostream 버전cin ..
항목 22 : 단독 연산자(op) 대신에 =이 붙은 연산자(op=)를 사용하는 것이 좋을 때가 있다. 사용자가 기대하는 연산자 동작// 아래의 연산자가 동작한다면,x = x + y;x = x - y;// 아래의 연산자도 동작한다고 기대하게 된다.x += y;x -= y;하지만 사용자 정의 타입이라면 위의 두 형태의 코드가 지원되리라는 보장은 전혀 없다.C++에서는 operator+, operatr=, operator+= 사이에 아무 관계가 없다.즉, 사용자의 기대를 충족시키려면 구현하는 수밖에 없다. 대입 형태(operator+=)와 단독 형태(operator+) 관계 맺기대입 형태를 사용해서 단독 형태를 구현하는 것도 괜찮은 방법이다.class Rational{public: ... R..
항목 21 : 오버로딩은 불필요한 암시적 타입 변환을 막는 한 방법이다. 암시적 변환// Unlimited Precision Integerclass UPInt{public: UPInt(); UPInt(int value); ...};const UPInt operator+(const UPInt& lhs, const UPInt& rhs);// 일반적인 사용법UPInt upi1, upi2;...UPInt upi3 = upi1 + upi2;// 이렇게 사용하게 된다면?upi3 = upi1 + 10;upi3 = 10 + upi2;UPInt는 int를 생성자로 받아들이기 때문에 암시적 변환이 일어나 UPInt 타입을 임시 객체로 생성한다.하지만, 임시 객체는 리소스의 낭비이다.사실 이 코드의 목적..