본문 바로가기
Development/C|C++|C#

[Effective C++]1. C++에 왔으면 C++의 법을 따릅시다.

by True Life 2016. 10. 14.


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