C++에 왔으면 C++의 법을 따릅시다.
앞으로 몇번에 걸쳐 Effective C++ 각 장마다 정리를 할거다.
최선을 다하겠으나 배우는 과정이라 실수 가능..
항목1. C++의 다중 패러다임
- 절차지향
- 함수이용
- 객체지향
- 일반화 프로그래밍
- 템플릿 프로그래밍
- STL 요소
- 생성자/소멸자 → '상수 객체에 대한 참조자 전달' (객체의 타입조차 모름)
- STL iter (반복자) : C의 포인터 역할
항목2. #define 대신 const, enum, inline 사용 권장
- #define은 선행처리자이며 나머지는 컴파일러가 수행함(헤더파일내 선언)
- 상수포인터 정의시
const char * const name = "~";
- *의 왼쪽 : 상수데이터
- *의 오른쪽 : 상수포인터
- 클래스 멤버 : 상수
- 선행처리자 변수 구현시 전치/후치 중복됨 : inline 사용
- 구 컴파일러에서는 선언 헤더, 정의 별개 구현
- static(정적 멤버 타입)상수는 정의X, 선언O : 옳은 표현(구조)
항목3. CONST
- *의 좌/우에 따른 상수데이터, 상수포인터
- iterator에 대한 const
const iterator : 상수포인터, const_iterator : 상수데이터
- 가능한 모든곳에 const 권장 (포인터-참조자도 반드시 const)
- 비트수준 상수성 : 객체의 어떤 데이터 멤버도 건드리면 안됨
cf. private char*에 대해 char &operator[] ~ const { 는 비트수준 상수성
→ 데이터 멤버가 포인터이므로 이에 대한 참조자로 포인터 접근 및 값 변경 가능
- 논리적 상수성 : 몇 비트 수정 가능하나 사용자측에서 눈치챌 수 었음
private text_len / len_is_valid; → 길이 캐시 사용
length '데이터 멤버 함수'는 private 두개를 바꾸지만 char*에 대해서는 비트수준 상수성
const 상수성 적용하되 캐시 관련 멤버들은 mutable 적용
- 코드 중복현상 방지 : function의 const, non_const 오버로딩시 함수 중복을 피하기 위한 캐스팅
const & ~ const { 와 non const의 중복 해결을 위함
non const → const 호출. static 캐스트로 const function 호출 후 const 캐스트 적용
※ const → non const 호출은 안정성 위반!
데이터멤버에서 const 의 영향 : const 객체시 상수데이터멤버가 호출됨.
※ 상수데이터멤버 : ~~ const {
항목4. 초기화의 습관
- constructor에서 본문 작성은 초기화 후 '대입'에 해당됨. "멤버 초기화 리스트" 사용 권장
- 멤버 초기화 리스트의 공백 초기화도 ctor 호출
- 초기화 순서는 '선언'순서
- 비지역 정적 객체의 순서는 개별 번역단위서 정해짐
※ 정적데이터 : stack, heap X
① 전역 ② 네임스페이스내 선언 ③ 클래스 내 static ④ 함수 내 static ⑤ 파일 유효 내 static
'Development > C|C++|C#' 카테고리의 다른 글
[Effective C++]3. 자원 관리 (0) | 2016.10.19 |
---|---|
[C++]JSON 데이터 트리(Tree)스키마 파싱 논문 구현 (0) | 2016.10.19 |
[Effective C++]2. 생성자, 소멸자 및 대입 연산자 (0) | 2016.10.16 |
[QT 5.7]QFileDialog 한글 깨짐 현상 (0) | 2016.10.12 |
[C++]static_cast와 C 스타일 캐스트의 차이 (1) | 2016.09.27 |