항목 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)으..
Effective C++ 검색 결과
항목 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..
이유에 앞서, 왜 사람들은 자신만의 new와 delete를 필요로 할까? 1. 효율성 때문 - operator new 와 operator delete의 디폴트 버전들은 일반적인 목적에 적합하다(제네릭 프로그래밍) - 해체작업시 개별 객체 해체는 개별 객체에 대한 크기 정보가 필요하다. - 개별 객체의 크기가 4바이트라 가정할때, 이 크기를 저장할 변수도 4바이트이다(포인터 크기 32비트환경) - 그러면 4바이트 할당을 위해 4바이트 소모는 .. 엄청난 비효율이다. 이유 1. 효율적인 해체가 가능해 지기 때문에 2. 항목 5가 가장 큰 이유 해결방법 1. 항목 8, 9 사용 2. union 으로 해결 (2. 개인적 생각, 클래스의 특성에 맞게 STL 로 작성하는게 더 효과적이라고 생각됨, 21세기(책은 2..
이유 1. 내부 영역에서의 변수명이나 함수명은, 외부 영역의 동일한 이름을 감춘다. 2. 감춤으로써 확장성이 떨어지기 때문이다. 해결방법 두가지 1. 클래스에 정의되어 있는 오버로딩된 operator new를 선언할 때 정상형식을 갖춘 operator new를 만들어 둔다. (참조. 이때 클래스에 정의된 operator new를 쓸때는 매개변수를 오버로딩에 맞춘다. 이것도 기초 문법이다) 2008/07/02 14:53 수정 2. 클래스에 정의되어 있는 오버로딩된 operator new의 매개변수를 디폴트값을 넣어, 분기 시켜라 (개인적으로 이 방법이 편하다고 생각된다) 2. 오버로딩된 매게변수에 따라 분기 시키는 방법과 using 키워드를 이용하여, 이름을 가리지 않도록 한다. 덧붙여 어느 방법이건 간에..
최근댓글