일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- Smart Pointer
- UE4
- 상속
- 비교 함수 객체
- 언리얼
- 메타테이블
- 스마트 포인터
- resource management class
- 영화 리뷰
- exception
- implicit conversion
- 예외
- 참조자
- 티스토리챌린지
- operator new
- lua
- 영화
- Effective c++
- c++
- 다형성
- 암시적 변환
- reference
- 오블완
- more effective c++
- effective stl
- 루아
- Vector
- Today
- Total
목록more effective c++ (33)
스토리텔링 개발자
항목 35. C++ 언어의 최신 표준안과 표준 라이브러리에 대해 익숙해지자. 레거시 C++(C++98/03) 라이브러리 범주표준 C 라이브러리를 그대로 지원문자열(string) 지원지역화(localization) 지원입출력 스트림 라이브러리 변경숫자 조작을 돕는 데이터 타입 지원복소수(complex)숫자 데이터 배열 클래스(valarray)숫자 조작 함수(부분합(partial sum), 인접차(adjacent difference) 구하기)STL(표준 템플릿 라이브러리(Standard Template Library)) 지원타입에 상관 없이 쓸 수 있는 일반 용도의 컨테이너와 알고리즘 표준 C++ 라이브러리의 두 가지 특징표준 라이브러리에 속해 있는 대부분의 것들은 템플릿으로 만들어져 있다.std::..
항목 34. 한 프로그램에서 C++와 C를 함께 사용하는 방법을 이해하자. 네임 맹글링(Name Mangling)C++ 컴파일러가 내부 호출용 이름을 만들어 함수마다 붙이는 동작.이 동작은 C에서는 발생하지 않는다.C에서는 함수 오버로딩이 발생하지 않기 때문이다.즉, 이름이 같은 함수란 존재하지 않는다.하지만 C++에서는 이름이 같은 함수를 부지기수로 볼 수 있다.사실, 오버로딩된 함수는 링커를 통과할 수 없다.같은 이름의 여러 함수를 구분할 수 없기 때문이다.그렇기 때문에 네임 맹글링을 사용한다.C로 제작한 라이브러리 함수를 C++에서 사용한다면?아래와 같은 C 라이브러리가 있다면..void drawLine(int x1, int y1, int x2, int y2);// C++ 컴파일러가 네임 맹글링..
항목 33. 상속 관계의 말단에 있지 않은(non-leaf) 클래스는 반드시 추상 클래스로 만들자 대입 문제class Animal{public: Animal& operator=(const Animal& rhs); ...};class Lizard : public Aanimal{public: Lizard& operator=(const Lizard& rhs); ...};class Chicken : public Animal{public: Chicken& operator=(const Chicken& rhs); ...};Lizard liz1;Lizard liz2;Animal* pAnimal1 = &liz1;Animal* pAnimal2 = &liz2;...*pAnimal1 = *..
항목 32. 미래 지향적인 프로그래머가 되자 미래 지향적인 프로그래밍사용하고 있는 라이브러리에 함수가 새로 추가될 수 있으며오버로딩도 추가로 이루어질 수 있다는 사실을 인식하고,이 사실로 인해 모호한 함수 호출이 있을 수 있다는 점을 조심하자.기존의 클래스 계통 구조에 새 클래스가 추가될 수 있고,오늘의 파생 클래스가 내일의 기본 클래스가 될 수 있다는 사실을 인식하고 대비하자.새로운 애플리케이션이 만들어질 수 있고,특정 함수의 호출환경이 달라질 수 있다는 사실을 기억하고,이런 함수가 어느 경우에서든 제대로 동작하도록 만들자.소프트웨어 유지 보수를 만든 사람이 맡지 않는 경우가 다반사이므로,다른 사람이 이해하고, 수정하고, 개선하는 데 큰 문제를 일으키지 않는 방법으로 설계하자. 주석이나 문서화 ..
항목 31. 함수를 두 개 이상의 객체(타입)에 대해 가상 함수처럼 동작하도록 만들기 우주선, 정거장, 소행성 의 충돌 구현class GameObject { ... };// 아래의 각 타입은 충돌 타입에 따라 충돌 시 다른 동작을 한다.class SpaceShip : public GameObject { ... };class SpaceStation : public GameObject { ... };class Asteroid : public GameObject { ... };void checkForCollision(GameObject& object1, GameObject& object2){ if(theyJustCollided(object1, object2)) { // 아래 함수의 ..
항목 30. 프록시(Proxy) 클래스 C++의 n차원 배열 문제변수를 배열의 차원으로 사용할 수가 없다.int data[10][20]; // 컴파일 성공void processInput(int dim1, int dim2){ int data[dim1][dim2]; // 컴파일 에러! ...}void processInput2(int dim1, int dim2){ int* data = new int[dim1][dim2]; // 컴파일 에러! ...} 2차원 배열 클래스 만들기templateclass Array2D{public: Array2D(int dim1, int dim2); ...};// 이런 식으로 사용할 수 있다.Array2D data(10, 20);Array2D..
항목 29. 참조 카운팅(Reference Counting) 참조 카운팅이란여러 개의 객체들이 똑같은 값을 가졌으면, 각각이 하나의 데이터를 공유하게 하여, 데이터의 양을 절약하는 기법이다. 참조 카운팅의 동기힙 객체의 관리를 편하게 하기 위함이다.힙에 할당된 객체는 소유권을 추적하는 일이 상당히 까다롭다.하지만 참조 카운팅을 사용하면 소유권을 일일이 추적하지 않아도 된다.똑같은 값을 가지고 있는 객체들이 값을 각각 가지게 되면 낭비이다. 참조 카운팅 기본 구현법class String{public: // 생성자 String(const char* initValue = ""); String(const String& rhs); // 소멸자 ~String(); ..
항목 28. 스마트 포인터(Smart Pointer) 스마트 포인터를 사용하는 이유생성과 소멸 작업을 조절할 수 있다.스마트 포인터가 생성되고 소멸되는 시기를 사용자가 결정할 수 있다.초기값을 스마트 포인터가 컨트롤하므로, 쓰레기값 문제가 없다.객체를 알아서 소멸시켜주므로 리소스 누수가 없다.복사와 대입 동작을 조절할 수 있다.스마트 포인터가 복사되고 대입될 때의 일을 사용자가 결정할 수 있다.깊은 복사와 얕은 복사를 원하는 대로 정의할 수 있다.혹은 복사 대입을 전혀 사용하지 못하도록 막을 수도 있다.역참조 동작을 조절할 수 있다.스마트 포인터가 가리키는 객체를 가져오려고 할 때 일어나는 일을 결정할 수 있다.지연 방식 데이터 / 명령어 가져오기(fetching)(항목 17 참조) 스마트 포인터..