일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C
- 메모리관리
- 스마트포인터
- 멀티코어 프로그래밍
- vector
- 게임공학과
- Unreal
- c++
- Atomic
- 옵저버
- 유니크포인터
- 프레임워크
- stl
- 멀티코어
- 쓰레드
- 옵저버 패턴
- 복사생성자
- Design Pattern
- observer pattern
- sequential
- 디자인패턴
- thread
- random access
- EFFECTIVE C++
- multi-core
- 멀티쓰레드
- MultiCore
- Multithread
- 한국산업기술대학교
- material
- Today
- Total
목록EFFECTIVE C++ (5)
태크놀로지
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/10vka/btqOUlIuTuQ/8bEQtmBCI3P6F51olYNM4k/img.jpg)
자원(resource)이란, 사용을 일단 마치고 난 후엔 시스템에 돌려주어야 하는 모든 것을 말한다. ※ 자원을 가져와서 다 썼으면, 무조건 해제해주어야 한다. 이번 포스팅 내용 객체 기반 방식의 C++가 지원하는 생성자, 소멸자, 객체 복사함수를 사용하여 자원관리 하는것을 다루겠다. 1. 객체를 사용하여 자원을 관리하자 class Investment{ public: Investment() { cout
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/p4Mbn/btqN8eDLctJ/k8R1IdHPBZ5Z9ihe066jJk/img.jpg)
1. 대입연산자는 *this의 참조자를 반환하게 하자 (convention) int x,y,z; x = y = z = 15; 위와 같이 대입연산은 여러개가 사슬처럼 엮일 수 있다. x = (y = (z = 15)); 또 하나의 특성은, 우측 연관 연산이라는 점이다. class Widget{ public: Widget& operator= (const Widget& rhs){ //... return *this; } } 이렇게 대입 연산이 사슬처럼 엮이려면 대입연산자는 좌변인자에 대한 참조자를 반환하도록 구현되어야 한다. (일종의 convention) +=, -=, *= 등 모든 형태의 대입연산자에서도 Convention이 적용된다. 2. operator=에서 자기대입에 대한 처리가 빠지지 않도록 하자 cla..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b5OjPH/btqNNhNYK5o/mnLVzc9Wnqu33aKlqmBGG1/img.jpg)
생성자 : 새로운 객체를 메모리에 만드는데 필요한 과정을 제어하고 객체의 초기화를 맡는다. 소멸자 : 객체를 없앰과 동시에 그 객체가 메모리에서 적절히 사라질 수 있도록 하는 과정을 제어한다. 대입연산자 : 기존의 객체에 다른 객체의 값을 줄 때 사용하는 함수 : 다음포스팅에서 진행 1. C++이 자동으로 만들어서 호출해 버리는 함수들에 촉각을 세우자 클래스안에 직접 선언해 넣지 않으면 컴파일러가 스스로 선언해 주도록 되어 있는 함수들 class Empty{ public: Empty() = default; Empty(const Empty& rhs) = default; ~Empty() = default; Empty& operator=(const Empty& rhs) = default; } 암시적(Impli..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/4vuo5/btqNEfJSt9J/jTrgGqFm9Is2DHJjKruo41/img.jpg)
초기화 : 객체가 항상 초기화 된다는 보장이 없다. 따라서 모든 객체를 사용하기전 항상 초기화 해주어야한다. 1. 대입과 초기화와 헷갈리지 말자. class X; // 멤버변수 theName, theAddress ,,, // 1. 대입 : 초기화가 아닌 대입이 되고 있다. X(name, address,,,) { theName = name; theAddress = address; ,,, } // 2. 초기화 : 멤버 초기화 리스트 X(name, address,,,) : theName(name), theAddress(address) ,,, 두번째 방법이 왜 더 효율적인가? 첫번째 방법은 기본생성자를 통해 미리 초기화 한후, 값을 대입해주고 있다. -> 기본생성자 호출 -> 복사 대입연산자 호출 두번째 방법은..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/kCTx9/btqNDn2sRiM/uIUynd8Lk5gVX6XI7Ej1vK/img.jpg)
1. define 대신 const, enum, inline을 사용하자 왜? #define ASPECT_RATIO 1.653 의 경우 우리는 ASPECT_RATIO로 알지만, 컴파일러에게 넘어가기전 숫자 상수로 밀어버리게 됨 에러메시지에 ASPECT_RATIO가 아닌 1.653으로 나타남 따라서 매크로 대신 const 상수를 사용하자! 상수를 사용할 경우 기호 테이블에 들어감. 디버깅시 확인가능 부동소수점 실수 타입일 경우, 컴파일을 거친 최종 코드 크기가 더 작게 나올 수 있음 -> 코드에서 ASPECT_RATIO를 사용한 코드마다 1.653으로 변경하는 사본이 생기기 때문 2. 클래스 내에 static 멤버 // header class GamePlayer{ private: static const int..