본문 바로가기

전체 글57

항목 20. '값에 의한 전달'보다는 '상수객체 참조자에 의한 전달' 방식을 택하는 편이 대개 낫다 1. 값에 의한 전달 class Person{ public: Person(); virtual ~person(); // 다형성을 가진 기본클래스는 소멸자를 가상소멸자로 한다.. 7장참조 // 객체 해제시 안되는 경우가 있기때문. private: string name; string address; }; class Student : Person { public: Student(); ~Student(); private: string name; string address; }; bool validate(Student s); Student plato; bool platoIsOk = validate(plato); // 값에 의한 전달 방식 * 예제풀이. (1) 매개변수 s를 plato로 초기화하기 위해 Student.. 2020. 1. 8.
항목 19. 클래스 설계는 타입 설계와 똑같이 취급하자 c++ 에서 새로운 클래스를 정의한다 ? => 타입을 하나 정의 하는것과 같다. 좋은 클래스 설계란? 문법이 자연스럽고, 의미구조가 직관적이며, 효율적인 구현이 한 가지 이상 가능해야하는데.. 한 개도 쉽지 않다. 1. 새로 정의한 타입의 객체 성성 및 소멸은 어떻게 이루어져야 하는가? (1) 클래스 생성자 및 소멸자의 설계가 바뀜 (2) 메모리 할당함수(new, delete)를 직접 작성할경우도 이들 함수의 설계에 영향을 미침 2. 객체 초기화는 객체 대입과 어덯게 달라야 하는가? (1) 초기화와 대입을 헷갈리지 않는 것이 중요하다. 3. 새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가? (1) '값에 의한 전달'을 구현하는 쪽은 복사 생성자이다. 기억해두자 4. 새로운 .. 2020. 1. 7.
항목 18. 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자 1. 사용자 타입시스템을 활용하여 인터페이스를 구성해보자. Class Date { public : Date(int month, int day, int year); … }; 1) 풀이 - 날짜 클래스의 생성자 예시이다. 2) issue - 매개변수 순서가 month, day year일때 사용자가 실수로 다른값을 넣을 수 있다. 3) 해결방법 - 새로운 타입을 들여와 인터페이스를 강화하여 해결하자. (아래 예시 참조) ex) 3) 예시 struct Day{ explicit Day(int d) : val(d) {} int val; } struct Month{ explicit … } struct Year{ explicit … } //이렇게 사용가능하다. Date d(Month(3), Day(14), Year(2.. 2020. 1. 7.
항목 17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 int priority(); //우선순위처리 함수 void processWidget(std:;tr1::shared_ptr pw, int priority); 위에서 processWidget을 어떻게 호출할까? 아래와 같이 하면 될까? processWidget(new Widget, priority()); 에러이다. 이유? tr1::shared_ptr은 explicit으로 선언되어 있기 대문에 암시적형변환이 불가하다. 정확하게 타입을 기재해주어야한다. 따라서 processWidget(std::tr1::shared_ptr(new Widget), priority()); 라고 기재해주면된다? 하지만 여기서도 자원낭비가 발생한다. 그이유는 호출프로세스에서 빵꾸가 날 수 있기때문이다. * processWidget의 호.. 2020. 1. 2.
항목 16. new 및 delete 를 사용할 때는 형태를 반드시 맞추자 std::string* strArr = new std::string[100]; … delete strArr //ERROR 위코드를 보면 100개의 string 객체중 99개는 정상적인 소멸과정을 못거칠 것이다. 객체 배열 해제시에는 []delete를 해줘야하는 이유는? 그전에 new, delete의 동작을 확인해보자. new연산자를 사용하면 2가지 동작을 수행한다. 1. 메모리 할당 2. 할당된 메모리에 대해 한 개 이상의 생성자 호출 delete연산자는? 1. 할당된 메모리에 대해 한 개이상의 소멸자 호출 2. 메모리 해제 요것도 확인해보자. 단일 객체와 배열객체의 메모리 배치구조 in Heap 단일 객체 case [object] 배열객체 [ 3 ][object][object][object] 대다수의 .. 2020. 1. 2.
항목 15. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근하도록 하자. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근가능하도록 하자 이코드를 보자. std::tr1::shared_ptr pInv(createInvestment()); … //그리고 이함수를 사용한다고 가정해보자. int daysHeld(const Investment *pi); //만약 위 함수를 아래코드와 같이사용한다면 에러! int days = daysHeld(pInv); //ERROR! 에러 사유) daysHeld는 Investment*의 실제포인터를 원하기 때문이다. 결론) RAII의 객체안에 실제자원을 변활해줄 방법이 필요 1. 명시적변환 (1) int days = daysHeld(pInv.get()); //실제포인터를 반환해준다 get함수를 이용해서 2. 암시적변환 (1) 포인터 역참조 연산자(.. 2019. 12. 30.