Chapter1
항목 1: C++을 하위 언어들의 연합체로 생각
C++을 상관이 있는 여러 언어들의 연합체로 생각 각 언어에 관한 규칙을 각개 격파
- C
- 객체지향 개념 - class를 쓰는 C에관한 모든것 (생성자, 소멸자, 캡슐화, 상속, 다형성, 가상함수…)
- 템플릿 - 일반화 프로그래밍부분
- STL - 템플릿 라이브러리
항목 2: #define 지양
전처리기 지시자보다 컴파일러를 더 가까이 하자 #define 쓸경우 컴파일 전에 상수로 치환 되기 때문에 컴파일러가 쓰는 기호 테이블에 들어가지 않으므로 에러 발생시 헷갈릴수 있음
실수 const double PI = 3.14
문자열 char const * const NAME = "Park"
등으로 대체 사용
enum hack 가장 #define에 가깝고(enum의 주소를 취할수 없기 때문에) 실무에서 많이 쓰임
enum {NUMS=3};
...
int scores[NUMS];
항목 3: const 적극 활용
cont int *a //상수 데이터
int const *a //상수 데이터(위와 같음)
int * const a //상수 포인터
int const * const a //상수 데이터, 상수 포인터
함수 리턴값 상수로 할 경우 실수 줄일수 있음
함수 매개변수는 할 수 잇으면 항상 const로 사용 권고
상수멤버함수
- 인터페이스 이해도 높임(객체를 변경 할 수 있는 함수인지 아닌지 알수 있음)
- 상수객체 사용 할 수 있게 함
항목 4: 객체를 사용하기 전에 반드시 객체를 초기화 하자
대입과 초기화는 다르다.
C++규칙에 어떤 객체든 객체의 데이터 멤버는 생성자의 본문 실행 전 초기화 되어야 한다고 명시됨
생성자 본문의 대입보다 멤버 초기화 리스트 사용 할 것
초기화 할 특정 값 없을시 기본 초기화 ()
데이터 멤버의 타입이 사용자 정의 타입일 경우 컴파일러는 그들의 기본 생성자를 호출하게 정의되어 있지만,
기본제공타입(int, char …)들은 초기화 되지 않을 수 있으므로 데이터 멤버 모두 초기화 리스트로 초기화 권장
멤버가 상수거나 참조자 일경우 초기화 리스트 사용이 필수로 강제됨
※ 초기화 리스트는 매개변수를 그 멤버의 생성자의 매개변수로 씀
※ 초기화 순서는 헤더에 선언된 순서 대로 이기 때문에 초기화 리스트의 순서도 동일하게 맞출것
비 지역 객체의 초기화 순서는 개발번역 단위에서 정해진다
정적객채(static object) - 생성된 시점부터 프로그램 종료시까지 살아 있는 객체
- 전역객체
- 네임스페이스 유효범위에서 정의된 객체
- 클래스안에서 static으로 선언된 객체
- 함수안에서 static으로 선언된 객체
- 파일 유효범위에서 static으로 선언된 객체
이들중 함수안에 있는 정적객체는 지역정적 객체(함수에 대해 지역성 가지므로), 나머지는 비지역 정적객체
모든 정적 객체는 프로그램 끝날때 소멸됨
-> main 함수 실행 끝날대 소멸자 호출
번역단위 - 컴파일을 통해 하나의 목적파일(object file)을 만드는 소스코드
기본적으로는 소스파일 하나가 되는데 #include 한 파일들 포함
별도로 컴파일된 소스파일이 두 개 이상 있으며, 각 소스파일에 비지역 정적객체가 한개 이상 있는경우
한쪽 번역단위에 있는 비지역 정적객체의 초기화가 진행되며 다른 번역단위에 잇는 비지역 정적객체를 사용 할 때
이 객체가 초기화 되어 있지 않을 수 있음.
별개의 번역단위에 정의된 비지역 정적객체들의 초기화 순서는 정해져 있지 않기 때문.
대처법으로 비지역 정적객체를 지역정적객체로 만드는방법이 있음
비지역 정적객체를 하나씩 맡는 함수를 만들고 그 객체를 함수 안에서 static으로 선언, 그 객체의 참조자 리턴
사용시 직접 호출 하지 말고 함수 호출(비지역의 지역과, singleton pattern의 구현양식)