책 정리/Effective C++ 2판 검색 결과
항목 17. operator=에서 재귀치환을 검사한다. 이유 1. 효율성 때문이다. - 같은 값이면 대입할 필요가 없다 2. 정확함을 때문이다. 항목11 참조 (동적메모리 할당시 기존의 값이 있다면 날리고 해야 한다, 무결성을 보증하기 위해서다) 해결 방법 포인터의 값을 체크 - 효율도 높고 확실하다. - 또한 포인터 안으로 들어가서 세밀체크도 가능하다. - 강추! 2008/06/01 19:52 수정 인자로 들어온 값을 그대로 복사하고, 교체한다.(copy and swap 기법) 주의 사항 1. 객체를 기본자료형처럼 만드는것은 까다로우니, 가능성을 항상 고려해라 개인적 생각 1. 해결 방법 으로 우선 체크한다. 2. 객체의 아이디가 있을경우 아이디로 체크한다.(아이디같은 개념의 데이터) 이렇게 두가지를 ..
항목 16. operator=에서 모든 데이터 멤버들로의 치환을 수행한다. 이유 1. 재정의했었다면, 클래스 업그레이드 후 값을 변경안하면 안들어 간다. 2. 상속 관계의 값이 operator=으로 정상적으로 들어가지 않는다. 해결 방법 1. 업그레이드 하면 주의깊게 다시 정의 할것 2008/06/01 19:52 수정 수정 2. 상속관계일때는 자식의 생성자의 초기화 값자체를 인자로써 부모클래스의 생성자를 호출하면 정상적으로 된다. 1. 포인터의 깊은 복사가 필요없다면, 오히려 정의하지 않는 편이 더 좋다.(일일이 변경하지 않아도 되니까!) 주의 사항 1. 1번이 주의 사항이다. 2008/06/01 19:52 수정 수정 1. 만약 정의해아만 한다면, 반드시 operator=을 상황에 맞게 정의해야 한다! ..
항목 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. 각 멤버가 초기화 될 ..
최근댓글