항목 12. 생성자에서 치환보다는 초기화를 사용한다. 이유. 2008/05/31 12:57 수정 1. const와 레퍼런스 멤버들을 초기화 할 수 없다, 1. const 멤버 객체와 와 레퍼런스 멤버 객체는 초기화 순간에만 초기화를 할수 있다. 2. 초기화 보다 연산이 한단계 더 많아 진다. 2. 대입연산자(치환)은 이미 초기화 순서를 지나친것이기 때문에 1단계 많은 연산을 하게 되는것이다. 참조 1 클래스의 생성은 이 두단계를 거친다. 첫번째. 데이터 멤버의 초기화 두번째. 호출된 생성자의 코드가 실행된다. 2. const와 레퍼런스는 항상 생성자 초기화에서만 할수 있다. 3. 클래스내부에선 정적상수만이 초기화 할수 있다 해결 방법 1. 대입연산자 보다는 멤버초기화 리스트 구역을 사용 한다. 주의점 1..
책 정리/Effective C++ 2판 검색 결과
항목 11. 동적으로 할당되는 메모리를 갖는 클래스를 위해서는 복사 생성자와 치환 연산자를 선언하라 이유 1. 복사된 대상의 포인터의 값을 복사하기 때문이다. 해설 복사된 대상의 포인터 값만을 복사해서도 사용 가능하지만, 해체시 오류가 발생될수 있으므로 복사 생성자와 치환연산자를 깊은 복사로 하라는것 이다. 2008/06/02 14:00 수정 하라는것이 아닌, 작동 상태에 대해서 어떻게(얕은복사 깊은복사 등) 고려해 보라는 뜻 해결 방법 1. reference counting 을 사용하여, 0일경우 지우는 방법 - 객체를 복사할때 와 지울때마다 카운팅 하여, 0이 되면 삭제하는 방법이다. 2. 깊은복사를 위하여 복사생성자와 치환연산자를 변경하라 3. 복사 생성자와 치환연산자를 private: 에 묶어 버..
이유에 앞서, 왜 사람들은 자신만의 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 키워드를 이용하여, 이름을 가리지 않도록 한다. 덧붙여 어느 방법이건 간에..
이유에 앞서, C++ operator new 와 operator delete의 관례란? 1. 올바른 인자값을 가져야 한다. 2. 메모리가 충분하지 않을때 에러처리 함수를 호출해야 한다. 즉, 사용 가능한 메모리가 없을 때 요구에 대처해야 한다. 이유 1. 부모 클래스에 선언한 operator new(new[])를 상속 받은 자식 클래스는 부모클래스의 new를 호출한다. (이때 오버라이딩은 되지 않는다. 문법 기초다. 그래서 오버로딩을 해서 쓰는데, 역시 오버로딩의 한계가있다) 하지만 대개 자식 클래스는 부모클래스보다 메모리를 더 많이 차지하므로, 자식클래스의 메모리 할당시 부모클래스의 용량(메모리)로 잡을수도 없는 노릇이다. 부모클래스의 용량을 포함하는 자식클래스의 용량의 할당이 올바른 반환값이다. 한마..
최근댓글