[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "
" 사용자가 저지를 만한 실수의 종류를 머리에 넣어 두자! "
- 인터페이스를 만들 때는 제대로 쓰기에 쉬우며 엉터리로 쓰기에 어렵게 만들 수 있도록 고민하고 또 고민하자!
class Date
{
public:
date(int Month, int Day, int Year);
};
매개 변수의 전달 순서에 의한 문제 발생
Date d(21, 4, 1999);
- Month와 Day가 바뀜!
매개 변수의 값이 터무늬 없는 경우 문제 발생
Date d(4, 210, 1999);
- 4월 210일은 없다...
📢 새로운 타입을 정의 해 상당수의 실수를 막을 수 있다!
[Month 타입 정의]
struct Month
{
exlicit Month(int m)
: iVal(m) {}
int iVal;
}
[Day 타입 정의]
struct Day
{
exlicit Day(int d)
: iVal(d) {}
int iVal;
}
[Year 타입 정의]
struct Year
{
exlicit Day(int y)
: iVal(y) {}
int iVal;
}
Datd d(21, 4, 1999);
- int형 변수와 새로 정의한 타입은 맞지 않음, 에러!Datd d(Day(21), 4, 1999);
- Month타입과 Day타입이 서로 바뀌어 맞지 않음, 에러!Datd d(Month(4), Day(4), Year(1999));
- 깔끔!
📢 적절한 타입이 준비되면 값에 제약을 가하더라도 괜찮은 경우가 생김
class Month
{
public:
static Month Jan() { return Month(1); }
static Month Feb() { return Month(2); }
}
if (a * b = c) ... // 비교 연산자를 사용하려다 나온 실수
📢 a와 b가 int라면 a*b에 대입을 하는건 말도 안되는 코드이다, 이런 int처럼 기본 제공 타입과 굳이 다르게 만들 필요가 없다면 사용자 정의 타입도 위 코드가 말이 안되게 만들자
Investment* createInvestment();
📢 자원 누출을 피하기 위해 얻어낸 포인터를 나중에라도 삭제 해야 한다.
shared_ptr<Investment> createInvestment();