일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- c++
- operator new
- 오블완
- implicit conversion
- 티스토리챌린지
- 루아
- resource management class
- 게임
- effective stl
- 비교 함수 객체
- 암시적 변환
- 스마트 포인터
- 상속
- 예외
- virtual function
- Smart Pointer
- lua
- Effective c++
- 언리얼
- more effective c++
- 메타테이블
- 영화
- Vector
- 영화 리뷰
- 참조자
- reference
- 다형성
- UE4
- 반복자
- exception
- Today
- Total
목록개발/Effective C++ (55)
스토리텔링 개발자
항목 23 : 멤버 함수보다는 비멤버 비프렌드 함수와 가까워지자. 멤버 버전 vs 비멤버 버전아래 예시에서 clearEverything과 clearBrowser 중 어떤 것이 나을까?class WebBrowser{public: ... void clearCache(); void clearHistory(); void removeCookies(); ... void clearEverything(); // 멤버 버전. clearCache, clearHistory, removeCookies를 호출};void clearBrowser(WebBrowser& wb) // 비멤버 버전{ wb.clearCache(); wb.clearHistory(); wb.remov..
항목 22 : 데이터 멤버가 선언될 곳은 private 영역임을 명심하자. 데이터 멤버를 숨기는 경우의 장점문법적 일관성 (항목 18 참조)데이터 멤버가 모두 비공개라면, 즉 공개 인터페이스가 함수 뿐이라면멤버 접근을 시도할 때 괄호 사용 여부에 대한 고민이 필요 없어지므로 일관성이 생긴다.데이터 멤버 접근성에 대해 정교한 제어가 가능읽기 / 쓰기 접근 권한을 직접 구현하여 세밀하게 제어할 수 있다. 캡슐화(encopsulation)함수를 통해서만 데이터 멤버에 접근할 수 있도록 한다.class SpeedDataCollection{ ...public: void addValue(int speed); double averageSoFar() const; ....};averageS..
항목 21. 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 들지 말자 모든 코드에 '참조에 의한 전달'을 반영하려들면 안 되는 이유class Rational{public: Rational(int numerator = 0, int denominator = 1);...private: int n, d; friend const Rational operator* (const Rational& lhs, const Rational& rhs);};...Rational a(1, 2); // a = 1/2Rational b(3, 5); // b = 3/5Rational c = a * b; // c는 3/10이 되어야 한다.참조자는 존재하는 객체에 붙는 이름일 뿐이다.즉, 참조자를 리턴하려면 이..
항목 20. ‘값에 의한 전달’보다는 ‘상수 객체 참조자에 의한 전달’ 방식을 택하는 편이 대개 낫다 값에 의한 전달C++는 함수로부터 객체를 전달받거나 함수에서 객체 전달시 ‘값에 의한 전달(pass-by-value)’ 방식을 사용한다.이는 c에서 물려받은 특성 중 하나이다.즉 특별히 다른 방식을 지정하지 않는 한, 함수 매개변수나 함수 반환값은 '사본'이다. 값에 의한 전달은 고비용이다.class Person{...private: string name; string address;};class Student : public Person{...private: string schoolName; string schoolAddress;};bool validateStudent(Stu..
항목 19. 클래스 설계는 타입 설계와 똑같이 취급하자 좋은 타입이란?문법(syntax)이 자연스럽다.사용 시 이질감이 없어야 한다.의미 구조(semantics)가 직관적이다.타입의 의미가 명확해서 어떤 역할인지 한눈에 알아차릴 수 있어야 한다.한 가지 이상 효율적인 구현이 가능하다.하지만 C++에서는 충분한 고민 없이 클래스 정의를 했다간 세 가지 중 어느 것도 달성하기 힘들다. 커스텀 클래스 설계 시 해야 할 질문들객체 생성 및 소멸은 어떻게 이루어져야 하는가?클래스 생성자, 소멸자 설계에 대한 고민이다.메모리 할당 함수(operator new, operator new[], operator delete, operator delete[]) 를 재정의 할 경우 이들 설계 역시 함께 고민되어야 한다..
항목 18. 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자 제대로 쓰기엔 쉽고 엉터리로 쓰기엔 어려운 인터페이스 개발사용자가 저지를만한 실수의 종류를 머리에 넣어두고 있어야 한다.날짜를 나타내는 클래스의 생성자를 예로 들어보자.Date(int month, int day, int year);문제점매개변수의 전달 순서가 잘못될 여지가 열려있다.각 매개변수를 새로운 타입으로 하여 인터페이스를 강화할 수 있다.월과 일에 해당하는 숫자가 어이없는 숫자일 수 있다.각 매개변수에 해당하는 적절한 타입이 준비되어 있으면 각 타입값에 제약을 가할 수 있다. 인터페이스 개발을 위한 방편들매개변수를 enum으로 정의좋은 방법이지만, 때로는 int처럼 쓰일 수 있는 등, 타입 안정성이 그리 믿음직..
항목 17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 맞추자 매개변수 평가다음 코드는 자원을 흘릴 가능성이 있다.void processWidget(shared_ptr pw, int priority);...processWidget(shared_ptr(new Widget), priority());컴파일러는 호출 코드를 만들기 전, 매개변수로 넘겨지는 인자를 평가한다.두 번째 인자(priority 함수)는 호출문 뿐이다.첫 번째 인자(shared_ptr(new Widget)은 두 부분으로 나뉘어져 있다."new Widget" 표현식을 실행하는 부분shared_ptr 생성자를 호출하는 부분그러므로 컴파일러는 다음 세 가지 연산을 위한 코드를 생성한다.priority를 호출한..
항목 16. new 및 delete를 사용할 때는 형태를 반드시 맞추자 new와 delete의 내부동작 순서new 연산자operator new 함수 내부에서 메모리를 할당한다.할당된 메모리에 대해 한 개 이상의 생성자 호출된다.delete 연산자할당된 메모리에 대해 한 개 이상의 소멸자가 호출된다.operator delete 함수 내부에서 메모리를 해제한다. delete로 삭제되는 포인터의 종류delete로 삭제되는 포인터는 아래 두 종류 중 하나이다.하지만, 각각은 메모리 배치 구조가 다르다.단일 객체메모리 배치 : [ object ]객체의 배열메모리 배치 : [ n ][ object ][ object ][..n은 배열의 크기 정보.delete 연산자는 자신에게 넘어온 포인터 종류가 둘 중 무..