Effective c++ 14

[Effective C++] 항목 5: C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자

1. 컴파일러가 저절로 선언하는 함수들 컴파일러는 직접 선언하지 않으면 자동으로 선언해주는 함수들이 있습니다. 복사 생성자생성자복사 대입 연산자소멸자class Yeoul {private: int* data; public: // 생성자 Yeoul(int val) { data = new int(val); } // 복사 생성자 Yeoul(const Yeoul& rhs) { data = new int(*rhs.data); } // 복사 대입 연산자 Yeoul& operator=(const Yeoul& rhs) { if (this != &rhs) { delete data; data = new int(*rhs.data); } return *this; ..

[Effective C++] 항목 3: 낌새만 보이면 const를 들이대 보자!

0. 함수에서 const 위치 개념잡기0-1. const가 앞에 있을 경우const int getValue() { return 42;} 이 경우, const는 함수의 반환값이 const라는 것을 의미합니다. 반환되는 int 값을 수정할 수 없습니다. 하지만 기본 타입(int, double 등)의 반환값은 이미 rvalue(우측값)이므로 수정이 불가능합니다. 따라서 기본 타입의 경우 반환 타입에 const를 붙이는 것은 실질적으로 의미가 없습니다. 그러나 포인터나 참조를 반환할 때는 의미가 있습니다: const int* getPointer() { static int value = 42; return &value; // 포인터가 가리키는 값을 수정할 수 없음} 0-2. const가 뒤에 있..

[Effective C++] 항목 2: #define을 쓰려거든 const, enum, inline을 떠올리자

C++에서는 선언(declaration)과 정의(definition)를 구분합니다:선언: 컴파일러에게 이름과 타입을 알려주는 것정의: 실제 메모리 할당이 이루어지는 것 1. #define을 지양해야 하는 이유들1-1. 컴파일 곤란#define ASPECT_RATIO 1.653 만약 이러한 코드를 쓰게 된다면 우리는 ASPECT_RATIO라는 이름으로 쓰지만 컴파일러는 이를 전부 1.653으로 인식하게 됩니다. 컴파일러로 넘어가기 전 선행처리자가 전부 1.653으로 바꾸어 버리기 때문입니다. 만약에 이부분에서 컴파일 에러가 발생하면 1.653이 에러메시지에 떠서 문제를 찾기 어려워질 수 있습니다. 매크로 상수는 기호 테이블에 기록되어 있지 않습니다. 그저 1.653으로 대체되어서 컴파일 될뿐입니다. 해결책..

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

04/12 오전 2시 Effective C++ 완독을 향한 여정을 시작합니다.1. C++의 발전초창기의 C++은 단순히 클래스를 쓰는 C++이었습니다. 그러나 C++은 시간이 지나면서 많은 발전을 했고 우리는 이것은 다중 패러다임 언어(Multiparadigm programming language) 이라고 부릅니다. 절차적, 객체 지향, 함수식, 일반화, 메타프로그래밍을 지원합니다. 2. C++을 연합체로 보자C++을 단일 언어에서 상관관계가 있는 여러 언어의 연합체로 보자. 그런뒤 각 언어에 대한 규칙을 각개 격파하자. 이러면 단순, 명확하고 기억하기도 편리하다. 그렇다면 C++는 어떠한 하위 언어로 이루어져 있을까? 2-1. C C++은 C를 기본으로 하고있다.그러나 C만 쓰기엔 기능이 너무 부족하다..