Effective C++ Ch.1
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++