항목 15. operator= 이 *this에 대한 레퍼런스(reference)를 리턴(return)하도록 한다. 이유 1. 연속적인 치환을 할 수 없게 된다. 2. 클래스를 사용하는 코드에서의 묵시적인 타입 변환도 할수 없게 된다. 3. const 레퍼런스로 받은 객체를를 &로 넘겨주지 못하게 된다. 4. 1,2,3 통틀어 객체도 기본자료형과 동일한 취급을 위해서다. 예) a = b = c = z = 1; 을 연산할수 있다! 해결 방법 1. 객체의 대입연산시 operator=을 수정하게 된다면 *this로 반환하게 만든다. 주의 사항 1. 혹시 기교를 위하여 다른값으로 넘겨주길 원하는 순간부터가 주의 사항이다! 개인적인 생각, 이래나 저래나 operator= 은 left.operator=(right)으..
전체 글 검색 결과
항목 14. 베이스 클래스에서 소멸자는 가상 함수로 선언해야 한다. 2008/05/31 14:36 수정 부재 : 모든 베이스 클래스가 아닌, 다형성을 지닌 클래스에 대해선 반드시 가상소멸자를 선언해야 한다. 이유. 1. 베이스 클래스로 자식 클래스의 소멸자를 호출하기 위해서다. - 자식(유도)클래스로 동적메모리 할당 후 부모클래스의 포인터로 받아서 사용할 경우가 생긴다면 자식(유도) 클래스의 소멸자를 꼭 호출해야지만 안전한 프로그래밍이 가능해 지기 때문이다. 문제 해결 1. 베이스 클래스의 소멸자를 virtual 의 키워드를 넣어주면 된다. 주의 해야 할점 1. 소멸자의 호출 시기를 분명히 숙지하고 있어야 한다. 2. 동적메모리를 사용하는 클래스일 경우, 매우 주의깊게 써야 한다 덧붙여 1. 추상 클래스..
항목 13. 클래스에 선언된 순서에 따라 멤버 초기화 리스트에 멤버들을 나열한다. MSVC 2005에선 초기화 리스트 순서와 상관이 없었음, 3판에서도 내용이 없는것으로 보아, C++ 표준에서 처리되어 없어진것으로 생각됨 2008/05/31 12:57 수정 이유 1. 엄연히 멤버 객체 초기화 순서가 있어, 초기화되지 않은 객체 초기화시 신비롭게 동작하기 때문이다. 주의점 1.멤버 초기화 리스트는 클래스 멤버 객체 선언 순으로 나열하여 초기화 하는것이 좋다. 이해해야 할 부분 1. 멤버 객체의 생성은 클래스 객체가 생성 될때 만들어 지고, 아래의 사항으로 넘어 간다. 멤버 객체의 생성 순서 1. 모든 멤버 객체의 메모리 공간 할당 2. 모든 멤버 객체의 메모리 공간에 이름 부여 3. 각 멤버가 초기화 될 ..
항목 12. 생성자에서 치환보다는 초기화를 사용한다. 이유. 2008/05/31 12:57 수정 1. const와 레퍼런스 멤버들을 초기화 할 수 없다, 1. const 멤버 객체와 와 레퍼런스 멤버 객체는 초기화 순간에만 초기화를 할수 있다. 2. 초기화 보다 연산이 한단계 더 많아 진다. 2. 대입연산자(치환)은 이미 초기화 순서를 지나친것이기 때문에 1단계 많은 연산을 하게 되는것이다. 참조 1 클래스의 생성은 이 두단계를 거친다. 첫번째. 데이터 멤버의 초기화 두번째. 호출된 생성자의 코드가 실행된다. 2. const와 레퍼런스는 항상 생성자 초기화에서만 할수 있다. 3. 클래스내부에선 정적상수만이 초기화 할수 있다 해결 방법 1. 대입연산자 보다는 멤버초기화 리스트 구역을 사용 한다. 주의점 1..
항목 11. 동적으로 할당되는 메모리를 갖는 클래스를 위해서는 복사 생성자와 치환 연산자를 선언하라 이유 1. 복사된 대상의 포인터의 값을 복사하기 때문이다. 해설 복사된 대상의 포인터 값만을 복사해서도 사용 가능하지만, 해체시 오류가 발생될수 있으므로 복사 생성자와 치환연산자를 깊은 복사로 하라는것 이다. 2008/06/02 14:00 수정 하라는것이 아닌, 작동 상태에 대해서 어떻게(얕은복사 깊은복사 등) 고려해 보라는 뜻 해결 방법 1. reference counting 을 사용하여, 0일경우 지우는 방법 - 객체를 복사할때 와 지울때마다 카운팅 하여, 0이 되면 삭제하는 방법이다. 2. 깊은복사를 위하여 복사생성자와 치환연산자를 변경하라 3. 복사 생성자와 치환연산자를 private: 에 묶어 버..
최근댓글