항목 21. 가능한 const를 이용한다. 이유 1. 여러 상황속에서 내가 정의한 데이터가 아무렇게나 변경 될수 있다. - 포인터, 레퍼런스로써 가리킨 데이터가 private인경우에도 변경되는 경우와 마찬가지다. 2. operator 의 반환값이 const 가 아닐경우 a * b = c 와 같은 경우 무슨일은 한거같은 느낌만 들기 때문이다.(실험해 보면 재미잇다) 해결 방법 1. const 키워드를 넣을수 있는 곳에는 주저말고 넣자. 2. 포인터로 값을 전달하게 될때는 이중 const로 묶어 놓자. 참조 사항 1. 내부 함수가 레퍼런스로 값을 반환해줄경우 private에 있는것도 접근이 가능해진다. 2. 1번의 사항은 포인터도 마찬가지다. 그러므로 이럴때 const를 사용 하면 좋다. 더 좋은것은 설계를..
Effective C++ 검색 결과
항목 20. 데이터 멤버를 공용 인터페이스에 포함시키지 않는다. 이유 1. 가독성이 매우 떨어진다. - 어떤것은 public 이고 어떤것은 private면 무엇이 public인지 private인지 알고 있어야 한다. 2. 정보은닉이 되지 않아 디버깅 능력이 떨어지게 된다. 해결 방법 1. 데이터는 모두 private로 넣어 둔다. 2. Get / Set 을 이용한다. 개인적인 생각 #define 문구를 만들어 멤버 데이터에 그 표시를 해둔다. #define NOACCESS #define READ #define WRITE #define ONLY class CBabo { public: private: READ ONLY int a; // ㅋㅋㅋ READ WRITE int b; WRITE ONLY int c; ..
19. 멤버 함수, 비멤버 함수 및 프렌드를 구별한다. # 멤버함수와 비멤버 함수의 차이점 멤버 함수는 가상 함수일 수 있다. 비멤버 함수는 가상 함수가 아니다! 이유 1. 클래스의 객체가 입출력 및 사칙연산시 자연스러운 호출 되지 않아, 가독성 및 인터페이스가 영 꽝이 되기 때문이다. 예) 3 * Class Object 와 Class Object * 3 의 차이이다. 해결 방법 1. 전역 변수로 operator를 만들어 사용 한다. 이때 관리를 위해 한 클래스 해더파일에 정의하는 편이 좋다. 2. 멤버 함수로써 처리가 가능하다면 멤버 함수로만 사용하고, friend가 필요 하다면, friend로 선언해야 한다. 3. 각각의 특징과 쓰임을 파악하면 된다. 주의점 코드를 보고 이해하자. #include u..
항목 18. 최소한의 완전한 클래스 인터페이스를 구축한다. 클래스 클라이언트 인터페이스란? 클래스를 이용하는 프로그래머가 접근할 수 있는 인터페이스다 (public) 이유 1. 인터페이스 내에 함수들이 많아짐에 따라 미래의 클라이언트들은 이해하기 어려워진다. 2. 적은 함수들을 가진 클래스보다 많은 함수들을 가진 클래스를 관리 또는 수정하기 더 어렵다. 3. 길다란 클래스 정의는 길다란 헤더파일을 초래하여, 컴파일 시간에 상당한 불이익을 가져올수 있다. 해결 방법 1. 한번만 Set 하면 되는 경우 생성자를 통하여 값을 넣어라. 2. operator= 으로 한번만 Set 하면 되는 멤버 변수의 값이 변경된다면, Get 함수 사용시 const 로써 불려지게 만들어라. (이건 매우 속편하다. 이런것까지 고려..
항목 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=을 상황에 맞게 정의해야 한다! ..
최근댓글