전체 글 106

7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자

[ Effective C++ ] 다음과 같이 시간 기록을 유지하는 TimeKeep 클래스를 기본 클래스로 만들어 이를 상속시키는 예제가 있다고 하자.class TimeKeeper{public: TimerKeeper(); ~TimeKeeper(); ...};class AtomicClock : public TimeKeeper { ... };class WaterClock : public TimeKeeper { ... };class WristWatch : public TimeKeeper { ... };TimeKeeper* getTimeKeeper(); // TimeKeeper에서 파생된 클래스를 통해 // 동적으로 할당된 객체의 포인터를 반환합니다. TimeKeeper* getTimeKeeper..

카테고리 없음 2025.02.01

6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자

[ Effective C++ ] 어떤 객체는, 그 자체 특성상 복사를 허용하는 것을 원하지 않을 수도 있다.복사 생성자와 복사 대입 연산자의 생성을 막고 싶지만, 컴파일러가 기본적으로 만들어주는 버전이 있기 때문에 다른 방식을 사용해야 한다.복사 생성자와 복사 대입 연산자의 암시적 생성 자체를 프로그래머가 막을 수는 없지만, 항상 접근 지정자를 public으로 해야 한다는 규칙은 없으므로, 다음 방식으로 복사를 막을 수 있다.class HomeForSale{public: ...private: ... HomeForSale(const HomeForSale&); // 선언만 존재 HomeForSale& operator=(const HomeForSale&);}또한, 위와 같이 선언만 하게 ..

5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자

[ Effective C++ ] C++의 어떤 멤버 함수는 프로그래머가 클래스 안에 직접적으로 선언해 넣지 않아도, 컴파일러가 저절로 선언해 주도록 되어았다.[1] 기본 생성자(default constructor)[2] 복사 생성자(copy constructor)[3] 복사 대입 연산자(copy assignment operator)[4] 소멸자(destructor) 이 때, 컴파일러가 만드는 함수의 형태는 모두 기본형이다.이들은 모두 public 멤버이며 inline 함수이다.class Empty{}; 위와 같이 클래스를 최소한으로 썼다면, 아래와 근본적으로 대동소이하다는 의미이다.class Empty{public: Empty() { ... } // 기본 생성자 Empty(const Empty..

4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자

[ Effective C++ ] 이 책을 읽는 프로그래머라면, 기본적으로 데이터 영역이 아닌 경우, 변수를 초기화하지 않았을 때 쓰레기값이 들어간다는 것은 숙지하고 있을 것이다.객체의 경우를 본다면, 생성자에서 대입(assignment)과 초기화(initialization)을 구분하여 사용하기 전에 반드시 객체를 초기화해야 한다. 아래 예제를 보자.class PhoneNumber { ... };class ABEntry{ // ABEntry = "Address Book Entry"public: ABEntry(const std::string& name, const std::string& addess, const std::list& phones); private: std::string theN..

3. 낌새만 보이면 const를 들이대 보자!

[ Effective C++ ] [ const ]의미적인 제약 : 해당 키워드가 붙은 객체는 외부 변경을 불가능하게 한다→ 어떤 객체의 값이 불변이어야 한다는 프로그래머의 의도를 컴파일러 및 다른 프로그래머와 공유할 수 있는 수단이다. 포인터에도 지정할 수 있다.char greeting[] = "Hello";char *p = greeting; // 비상수 포인터, // 비상수 데이터 const char *p = greeting; // 비상수 포인터 // 상수 데이터 char *..

2. #define을 쓰려거든 const, enum, inline을 떠올리자

[ Effective C++ ] 또는, "가급적 선행 처리자보다 컴파일러를 더 가까이 하자"→ 선행 처리자는, 전처리기(Preprocessor)를 의미 #define을 통해 전처리 단계에서 값을 바꿔치기 한다면, 컴파일러는 해당 사실을 모르기 때문에 프로그래머의 입장에서 디버깅하기 어려울 수 있다.#define ASPECT_RATIO 1.653의 경우, 컴파일러는 1.653만 알기 때문이다.symbol table에 포함되지 않는 것이다. 또한 해당 매크로를 다른 프로그래머가 작성했을 경우, 1.653이 어디서 왔는지 알기 어려울 수 있다. 그래서, 이 책의 저자는 아래와 같은 const를 사용하는 방법을 권장한다.const double AspectRatio = 1.653; #define의 경우 전처리 단..

1. C++를 언어들의 연합체로 바라보는 안목은 필수

[ Effective C++ ] 1) C블록, 문장, 선행 처리자, 기본제공 데이터타입, 배열, 포인터 등 C를 기본으로 하고 있음. 2) 객체 지향 개념의 C++클래스(생성자, 소멸자), 캡슐화, 상속, 다형성, 가상 함수(동적 바인딩) 3) 템플릿 C++템플릿 메타프로그래밍(template metaprogramming) 4) STL컨테이너(container), 반복자(iterator), 알고리즘(algorithm), 함수 객체(function object)...  → 4가지 하위 언어들이 C++를 이루고 있다는 점. [ 정리 ]- C++를 사용한 효과적인 프로그래밍 규칙은 경우에 따라 달라진다. 그 경우란, 바로 C++의 어떤 부분을 사용하느냐이다.

0. 용어 사용에 대하여

- 선언 (declaration) - 시그니처(signature) - 정의 (definition) - 초기화 (initialization) - 기본 생성자 (default constructor) - 복사 생성자 (copy constructor) - 복사 대입 연산자 (copy assignment operator) - 함수 객체 (function object) - 미정의 동작 (undefined behavior) - 인터페이스 (interface) - 사용자 (client) - 생성자와 소멸자 : 주석에서는 각각 ctor, dtor로 나타냄