Books/Effective C++
[Effective C++] 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자
[Effective C++] 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자
2022.05.08비어있지만, 비어있지 않은 class C++에서는 직접 선언하지 않아도 복사 생성자(copy constructor), 복사 대입 연산자(copy assignment operator), 소멸자(destructor), 생성자를 기본형으로 선언해준다. 이들은 모두 public멤버이며 inline 함수이다. 즉, 아래의 클래스를 선언했더라도 class Empty {}; 생성자와 소멸자, 복사 생성자, 복사 대입 연산자들이 암시적으로 선언되어 있는 것과 같다. class Empty { public: Empty() {...} // 기본 생성자 Empty(const Empty& rhs) {...} // 복사 생성자 ~Empty() {...} // 소멸자 Empty& operator=(const Empty& rhs) ..
[Effective C++] 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자
[Effective C++] 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자
2022.05.07C++의 초기화 C++은 객체의 값의 초기화를 보장하지 않는다. 초기화되지 않은 값을 내버려 두면 정의되지 않은 동작이 그대로 나올 수 있기 때문에 항상 초기화를 해주는 것이 좋다. 기본 제공 타입으로 만들어진 비멤버 객체에 대해서 초기화는 아래처럼 할 수 있으며 int x = 0; // int의 직접 초기화 const char * text = "A C-style string"; // 포인터의 직접 초기화 double d; std::cin>> d; // 입력 스트림에서 읽음으로써 초기화 수행 이런 부분을 제외한 C++의 초기화 나머지 부분은 생성자로 귀결되기 때문에 생성자에서 지킬 규칙은 간단하다. 그 객체의 모든 것을 초기화하면 된다. 이때, 대입(assignment)을 초기화(initializatio..
[Effective C++] 3. 낌새만 보이면 const를 들이대 보자!
[Effective C++] 3. 낌새만 보이면 const를 들이대 보자!
2022.05.07const의 매력 '의미적인 제약'을 소스코드 수준에서 붙인다는 점 컴파일러가 이 제약을 단단히 지켜준다는 점 즉, 어떤 값이 불변이어야 한다는 제작자의 의도를 컴파일러 및 다른 프로그래머와 나눌 수 있는 수단이 된다는 점이 매력적이라 볼 수 있다. const는 팔방미인 클래스 바깥에서 전역 혹은 네임스페이스 유효 범위의 상수를 선언(정의)하는 데 사용할 수 있으며 파일, 함수, 블록 유효 범위에서 static으로 선언 한 객체에도 const를 붙일 수 있다. 클래스 내부에서는 정적 멤버 및 비정적 데이터 멤버 모두를 상수로 선언할 수 있다. Q. 포인터는 어떨까? char greeting[] = "Hello"; char* p = greeting; // 비상수 포인터, 비상수 데이터 const char*..
[Effective C++] 2. #define을 쓰려거든 const, enum, inline을 떠올리자
[Effective C++] 2. #define을 쓰려거든 const, enum, inline을 떠올리자
2022.05.06주제에 더 가까운 제목은 가급적 선행 처리자보다 컴파일러를 더 가까이 하자.라고 한다. #define 상수의 단점 #define ASPECT_RATIO 1.653 ASPECT_RATIO가 기호식 이름으로 보이지만 컴파일러에게 넘어가기 전에 전처리기가 숫자 상수(1.653)로 바꿔버리기 때문에 ASPECT_RATIO라는 이름은 컴파일러가 쓰는 기호 테이블에 들어가지 않는다. 그래서 숫자 상수로 대체된 코드에서 컴파일 에러라도 발생하게 되면 에러 찾기가 꽤나 힘들 수 있다. (소스코드엔 ASPECT_RATIO, 에러 메시지는 1.653) 또, 기호 테이블에 이름이 없기 때문에 기호식 디버거에서도 문제가 나타날 수 있다. 해결 방법 : const const double AspectRatio = 1.653; 상..
[Effective C++] 1. C++을 언어들의 연합체로 바라보는 안목은 필수
[Effective C++] 1. C++을 언어들의 연합체로 바라보는 안목은 필수
2022.05.04초창기의 C++ 단순히 C 언어에 객체 지향 기능 몇 가지가 결합된 형태 오늘날의 C++ 다중패러다임 프로그래밍 언어(multiparadigm programming language)로 아래의 개념들을 지원하고 있다. 절차적 프로그래밍 객체 지향 프로그래밍 함수식 프로그래밍 일반화 프로그래밍 메타 프로그래밍 따라서 C++을 잘 사용하기 위해선 단일 언어가 아닌, 상관관계가 있는 여러 언어들의 연합체로 봐야 한다. C++의 하위 언어 C++은 4가지의 하위 언어들로 이루어져 있다. 1. C C++의 기본이 되는 언어 블록, 문장, 선행 처리자, 기본 제공 데이터 타입, 배열, 포인터 등 2. 객체 지향 개념의 C++ '클래스를 쓰는 C'에 관한 모든 것 클래스(생성자와 소멸자 개념까지), 캡슐화, 상속, 다..