1. 이펙티브 C++
1. C++에 왔으면 C++의 법을 따릅시다.
2. 생성자, 소멸자 및 대입 연산자
131066
정문철
2. C++를 언어들의 연합체로 바라보는 안목은 필수
C++은 단순히 C언어에 객체 지향 기능 몇 가지가 결합된 형태
!
계속 발전되고 여러가지 프로그래밍 개념이 추가됨
!
- 여러 언어의 연합체
3. C - C++의 기초가 되는 언어
!
객체 지향 개념의 C++ - 클래스(생성자, 소멸자 개념까지), 캡슐화, 상속,
다형성, 가상함수 등 객체 지향의 개념 추가
!
템플릿 C++ - C++의 일반화 프로그래밍 부분
!
STL - 템플릿 라이브러리
C++은 하위 언어들로 구성되어 있고
각각의 하위 언어가 자신만의 규칙을 갖고 있다.
4. #define을 쓰려거든 const, enum, inline을 떠올리자
define은 컴파일러가 확인하기 전에 처리되어 버린다.
이 때문에 몇가지 문제가 발생할 수 있으니 가능하면
컴파일러를 믿고 컴파일러에게 일을 맡기자.
5. #define ASPECT_RATIO 1.653
이런식으로 쓰면 컴파일 에러가 났을때 ASPECT_RATIO라고
표시 되 질 않고 3.14라고 표시가 나서 에러 찾기 힘듬
!
-상수를 사용하자
const double AspectRatio = 1.653;
!
!
+ define을 쓰면 코드안에 1.653이 등장 횟수만큼 생성되지만
상수를 쓰면 여러 번 사용되더라도 한 개만 생기는 경우가
발생 할 수 있다.
6. 상수 포인터(constant pointer)를 정의할 때에는 주의하자.
!
상수 정의는 대개 헤더 파일에 넣게 되므로 포인터는 const로 선언하고
포인터가 가르키는 대상까지 const로 선언을 해줘야 한다
(2번 const사용)
!
const char* const authorName = “Scott Meyers”;
!
클래스 멤버로 상수를 사용할 때 사본 개수가 한개로 만들고 싶으면
static을 사용한다.
7. 주소가 필요하거나 컴파일러가 문제를 일으키면
(클래스 상수의 초기값이 해당 상수가 선언된 시점에서 바로 주어지기 때문…)
헤더에 선언만 하고 구현 파일에서 정의를 하자.
8. 클래스를 컴파일 할 때 클래스 상수의 값이 필요할 때에는
(배열 초기화 - 배열의 크기 필요)
!
enum을 사용하자.
9. enum을 쓰면 좋은점
!
-다른 사람이 주소를 얻는다든지 참조자를 쓰는것을 막을 수 있다.
-#define처럼 쓸데없는 메모리 할당을 하지 않는다.
-템플릿 메타 프로그래밍에서 많이 사용된다.
10. 매크로를 만들 때에는 #define이 아니라 inline을 사용하자.
!
define을 사용한 기존 매크로의 효율을 그대호 유지하면서
정규 함수의 모든 동작방식 및 타입 안정성까지 취할 수 있다.
11. 낌새만 보이면 const를 들이대 보자
외부 변경을 불가능하게 하는 제약 사항을 만들어
제작자의 의도를 컴파일러 및 다른 프로그래머와 나눌 수 있다.
12. const가 * 왼쪽에 있으면 포인터가 가리키는 대상이 상수고
오른쪽에 있으면 포인터가 상수
!
const가 * 양쪽에 있으면
가리키는 대상 및 포인터가 다 상수
29. 예외 삼키기 - 로그를 남긴뒤에 계속 진행
(예외를 그냥 무시한 뒤라도 프로그램이 신뢰성 있게 실행을 지속할 수 있어야 합니다.
30. -소멸자에서는 예외가 빠져나가면 안된다.
소멸자 안에서 예외가 나올 수 있으면 소멸자안에서 잘 처리하던지
프로그램을 종료해라.
!
-연산중의 예외에 사용자가 반응해야 한다면
보통의 함수로 만들자(소멸자X)
31. 객체 생성 및 소멸 과정 중에는
절대로 가상 함수를 호출하지 말자 붙들어 놓자
!
발판을 밟고 있는 상태에서 발의 발판을 빼는 느낌이랄까
!
가상함수가 실행되지 않고 그냥 자신의 함수가 실행이된다.
왜냐면 아직 가상함수 쪽은 초기화가 되지도 않은상태다.
!
소멸도 마찬가지
컴파일러가 안된다고 해주는 경우도 있다.