Study/C/C++

Effective C++ Ch.1

리쥬쥬 2017. 5. 23. 16:18

Chapter 1. C++에 왔으면 C++의 법을 따릅시다.


항목 1. C++를 언어들의 연합체로 바라보는 안목은 필수


( C++ ) = ( C ) + ( 객체 지향 개념의 C++ ) + ( 템플릿 C++ ) + ( STL )


C : 절차 지향 개념의 언어, C++의 기본이 된다.


객체 지향 개념의 C++ : 클래스, 캡슐화, 상속, 다형성, 가상 함수 등을 포함

- 클래스 : 데이터와 기능을 구현하는 일종의 틀

- 캡슐화 : 외부의 객체로부터 내부의 데이터에 대한 접근을 제한하는 것(정보 은닉)

- 상속 : 기존의 클래스들을 바탕으로 새로운 클래스를 만든다.

- 다형성 : 하나의 인터페이스로 다양한 기능을 가질 수 있다. 오버로딩, 오버라이딩


템플릿 C++ : 템플릿 메타프로그래밍 - 템플릿을 이용한 프로그래밍, 컴파일러에게 프로그램 코드를 생성하도록 하는 방식


STL : Standard Template Library


항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자


define문의 문제점 : 

- define문은 전처리기에서 구현부로 대체하여 컴파일러에게 넘어가기 때문에 컴파일러의 기호 테이블에 올라가지 않는다.

그렇기 때문에 define문을 사용한 곳에서 문제가 발생한다면, 디버깅하기 어려워질 수 있다.

전처리기에 의해 대체되어 올라가는 값의 사본이 코드 내 등장 횟수만큼 생긴다.


ex) #define MAX(a, b) ((a) > (b) ? (a) : (b))

int a = 5, b = 0;

MAX(++a, b);        // 두 번 증가 / ((++a) > (b) ? (++a)) / a = 7;

MAX(++a, b+10);   // 한 번 증가 / ((++a) > (b) ? (b)) / a = 6;


1. const를 이용

- const로 상수 타입의 데이터로 만들면 컴파일러의 기호 테이블에 올라간다.

-> 디버깅이 가능하다. 사본이 딱 한 개만 생긴다.


- 주의 사항

1. 상수 포인터를 정의

- 포인터를 const로 선언하고, 포인터가 가리키는 대상도 const로 선언해주는게 보통이다.

2. 클래스 멤버의 상수 정의

- ex) 유효 범위를 클래스로 한정, 사본 개수 한 개 -> 정적 멤버

-> 클래스 상수의 정의는 구현 파일에 둔다. but 초기화 x


2. enum을 이용

- const보다 define에 가까움 -> 주소를 취할 수 없음


3. inline을 이용

- 정규 함수의 모든 동작 방식 및 타입 안정성을 취할 수 있음 -> 함수처럼 쓰려고 할 때



항목 3. 낌새만 보이면 const를 들이대 보자


ex)  char name[] = "Jiu";

const char * p = name;            // 상수 데이터, 비상수 포인터    -> *p = "Jiwoo"; 안 됨

char const * p = name;            // 위와 동일

char * const p = name;            // 비상수 데이터, 상수 포인터    -> p++; 안 됨

const char * const p = name;    // 상수 데이터, 상수 포인터       -> 다 안 됨


const가 * 왼쪽에 있으면 데이터 상수화 / 오른쪽에 있으면 포인터 상수화 


ex) if(a * b = c)    // 프로그래머의 실수 -> 에러를 띄워주자. 

- operator* 의 반환 값을 const로 만들자

const를 반환한 값에 대입 연산 시도 -> 에러




추가 정리 예정



출처 : Effective C++