시작은 미미하나 끝은 쥬쥬하리라.

Effective C++ 17

[effective C++] Chapter 02 : 07. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자

07. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 팩토리 함수 가상 소멸자 순수 가상 소멸자 이것만은 잊지 말자 ! 팩토리 함수 만약 위와 같이 시간에 관한 정보를 담고 있는 TimeKeeper 객체가 있고, 사용자들은 시간 정보에 접근하고 싶어한다고 가정해보자. 이때, 이 시간 기록 객체에 대한 포인터를 손에 넣는 용도로 함수를 정의하면 이것이 팩토리 함수이다. 팩토리 함수의 정확한 정의는 "새로 생성된 파생 클래스 객체에 대한 기본 클래스 포인터를 반환하는 함수" 이다. 위와 같이 코드를 정의하면 TimeKeeper에서 파생된 클래스를 통해 동적으로 할당된 객체의 포인터를 반환 받을 수 있다. 하지만 함수에서 반환되는 객체는 힙에 있게 되므로 메모리의 누수를 막기 위해 해..

Study/Effective C++ 2023.07.30

[effective C++] Chapter 02 : 06. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자

06. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 복사 생성자 / 복사 대입 연산자 private 선언 클래스 멤버 및 friend 함수의 호출 제한 복사 방지를 의미하는 클래스 정의 이것만은 일지 말자 ! 복사 생성자 / 복사 대입 연산자 private 선언 만약 하나의 객체가 복사되는 것을 막고 싶다면 어떻게 하는 것이 좋을까 ? 예를 들어, HomeForSale이라는 클래스가 있고 이는 자산을 의미하며 자산은 유일하기 때문에 이것의 사본을 만드는 것은 이치에 맞지 않다고 한다면, 해당 객체를 복사하려 하는 코드는 컴파일 되지 않게 만드는 것이 맞다. 해답은 컴파일러가 자동으로 생성하는 모든 함수는 public으로 처리 된다는 사실에 있다. 따라서 자동으로 생성되는 복사..

Study/Effective C++ 2023.07.30

[effective C++] Chapter 02 : 05. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자

05. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 Empty Class 복사 생성자 / 복사 대입 연산자의 역할 이것만은 잊지 말자 ! Empty Class C++의 컴파일러는 개발자가 클래스 안에 멤버 함수를 직접 선언해주지 않으면 컴파일러가 저절로 선언해주는 것이 있다. 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자는 선언이 되어있지 않은 경우 컴파일러가 자동적으로 선언하는 함수에 해당하고 이들은 모두 public 멤버 그리고 inline 함수로 선언된다. 따라서 아래의 두 클래스는 동일하다. 컴파일러가 기본 함수를 자동 생성하는 시점은 컴파일러가 판단해서 해당 함수가 필요하다고 생각되는 시점이며 위와 같이 코드가 선언되어 있을 때, 각각의 함수들이 생성되는 시점은 아래와..

Study/Effective C++ 2023.07.29

[effective C++] Chapter 01 : 04. 객체를 사용하기 전에 반드시 그 객체를 초기화하자

04. 객체를 사용하기 전에 반드시 그 객체를 초기화하자 대입과 초기화 비지역 정적 객체의 초기화 순서 이것만은 잊지 말자 ! 대입과 초기화 C++의 초기화 C++에서는 변수 혹은 객체를 선언했을 때, 확실하게 초기화가 된다는 것이 보장되지 않는다. 따라서 가장 좋은 방법은 모든 객체르 사용하기 전에 항상 초기화 하는 것이다. 기본 제공 타입으로 만들어진 비멤버 객체에 대해서는 아래와 같이 손수 초기화를 해주어야 한다. 비멤버 객체의 초기화를 위와 같이 진행하고 나면 남은 것은 멤버 객체의 초기화 즉, 생성자의 역할로 귀결된다. 생성자가 지킬 규칙은 "그 객체의 모든 것을 초기화하자!"로 간단하지만 대입(assignment)와 초기화(initialization)을 혼동하지 않는 것이 중요하다. 대입과 초..

Study/Effective C++ 2023.07.23

[effective C++] Chapter 01 : 03. 낌새만 보이면 const를 들이대 보자 !

03. 낌새만 보이면 const를 들이대 보자 ! const 키워드의 사용 상수 멤버 함수 상수 멤버(const 멤버)의 양대 개념 상수 멤버/비상수 멤버 함수에서 코드 중복 피하기 이것만은 잊지 말자 ! const 키워드의 사용 const const 키워드가 붙은 객체는 외부 변경을 불가능하게 만드는 의미적인 제약이 붙게 되고 컴파일러는 이 제약은 단단히 지켜준다. 클래스 외부 - 전역 혹은 네임스페이스 유효범위의 상수를 선언 및 정의하는데 사용 - 파일, 함수, 블록 유효범위에서 static으로 선언한 객체에 const 사용 가능 클래스 내부 - 정적 멤버 및 비정적 데이터 멤버 모두 상수로 선언 가능 - 포인터 및 포인터가 가리키는 대상 모두 상수로 지정할 수도 있고 지정하지 않는 것도 가능(기본적..

Study/Effective C++ 2023.07.23

[effective C++] Chapter 01 : 02. #define을 쓰려거든 const, enum, inline을 떠올리자

02. #define을 쓰려거든 const, enum, inline을 떠올리자 #define의 문제와 해결 #define을 통해 상수를 교체하는 경우 주의할 점 나열자 둔갑술(enum hack) 매크로 문제에는 inline 함수 템플릿 #define의 문제와 해결 문제 위와 같이 매크로가 정의되어 있는데 만약 위와 관련해서 에러가 발생하는 경우 혼동이 일어날 수 있다. 코드가 컴파일러에 의해 컴파일 되기 이전에 선행 처리자는 해당 지시자를 밀어버리고 숫자 상수로 바꾸게 된다. ASPECT_RATIO라는 명칭은 컴파일러가 쓰는 기호 테이블에 들어가지 못하게 되고, 따라서 에러가 발생하는 경우 에러 메시지에는 1.653이라는 값이 등장하게 되고 이는 에러를 파악하는 입장에서 직관성이 떨어지고 혼동이 발생할 ..

Study/Effective C++ 2023.07.22

[effective C++] Chapter 01 : 01. C++를 언어들의 연합체로 바라보는 안목은 필수

01. C++를 언어들의 연합체로 바라보는 안목은 필수 C++의 과거와 현재 C++ 하위 언어 4가지 C++를 언어들의 연합체로 바라보는 안목의 필요성 이것은 잊지 말자 ! C++의 과거와 현재 C++를 언어들의 연합체로 바라보는 안목은 필수이다. 그 이유는 C++의 초창기와 현재의 C++의 차이에 있다. 초창기 C++ - C언어에 단순히 객체지향만이 결합된 형태 현재의 C++ - 함수의 구성 방식을 크게 바꾸는데 일조한 예외 처리 제공 - 프로그램 설계의 새로운 사고방식을 일깨워준 템플릿 제공 - 확장성에 대한 새로운 지평을 연 STL 제공 - 다중 패러다임 프로그래밍 언어 현재의 C++은 절차적 프로그래밍을 기본으로 객체지향, 함수식, 일반화 프로그래밍을 포함하며 메타프로그래밍까지 지원하는 다양한 표..

Study/Effective C++ 2023.07.22