본문 바로가기

EFFECTIVE C++7

[C++] 스마트 포인터(Smart Pointer) - (1) References Effective C++ (항목 13) 씹어먹는 C++ (https://modoocode.com/229) Contents 스마트 포인터(Smart Pointer) RAII(Resource Acquisition Is Initialization) unique_ptr make_unique 프로그래밍 분야에서 리소스란, 사용을 하고난 후에는 시스템에 돌려주어야하는 모든 것을 말합니다. 돌려주지 않는 순간부터 문제가 하나둘씩 생겨날 수 있습니다. C++ 프로그램에서 가장 흔하게 사용되는 리소스로 동적 할당된 메모리를 말할 수 있는데, 이 메모리를 할당하고서 해제하지 않으면 메모리가 누수됩니다. 사실 메모리는 프로그램에서 관리해야되는 많은 리소스 중에 한 가지일 뿐입니다. 리소스에는 File D.. 2021. 8. 2.
[C++] 가상 함수 (virtual, override 키워드) References Effective C++ (항목 9) 씹어먹는 C++ (https://modoocode.com/210) Contents 가상 함수 (virtual 키워드) 오버라이드(override 키워드) 다형성 (polymorphism) 생성자/소멸자에서의 가상 함수 호출(주의사항) 2021.07.28 - [C & C++] - [C++] 가상 소멸자 [C++] 가상 소멸자 Reference Effective C++ (항목 7) Contents 다형성을 가진 기본(base) 클래스에서의 소멸자 가상 소멸자 가상 함수 테이블 아래와 같은 TimeKeeper라는 기본(base) 클래스가 있고, 이 클래스를 상속받는 AtomicCl.. junstar92.tistory.com 이전 글에서 가상 소멸자에 대.. 2021. 7. 30.
[C++] 가상 소멸자 Reference Effective C++ (항목 7) Contents 다형성을 가진 기본(base) 클래스에서의 소멸자 가상 소멸자 가상 함수 테이블 아래와 같은 TimeKeeper라는 기본(base) 클래스가 있고, 이 클래스를 상속받는 AtomicClock / WaterClock / WristWatch라는 파생(Derived) 클래스가 있다고 가정해봅시다. 그리고 이 객체에 대한 포인터를 얻는 용도로 팩토리 함수(factory function, 새로 생성된 파생 클래스 객체에 대한 기본 클래스 포인터를 반환하는 함수)도 생성합니다. (편의상 AtomicClock의 내용만 채우고, 나머지는 생략하였습니다. 따라서 getTimeKeeper 함수도 AtomicClock의 인스턴스를 반환하도록 구현했습니다.. 2021. 7. 28.
[C++] 자동 생성되는 생성자, 소멸자 및 대입 연산자 Reference Effective C++ (항목 5, 6) Contents 컴파일러가 자동으로 생성하는 생성자, 소멸자, 복사 대입연산자 자동으로 생성되는 함수의 사용을 금지하는 방법 우리가 사용하는 거의 모든 C++ 클래스에서 한 개 이상 꼭 들어있는 것들이 생성자와 소멸자, 대입연산자입니다. 이들을 C++ 프로그램에 있어서 매우 중요한 역할들을 수행합니다. 생성자는 새로운 객체를 메모리에 할당하는 데 필요한 과정들을 제어하고 객체의 초기화를 담당하는 함수이고, 소멸자는 객체를 없애면서 동시에 그 객체가 메모리에서 적절히 해제하는 과정을 제어하는 함수이며, 대입연산자는 기존의 객체에 다른 객체의 값을 대입할 때 사용하는 함수입니다. 이번 글에서는 Effective C++의 항목 5, 6에서 이야기하는.. 2021. 7. 28.
[C++] 객체 초기화 / 비지역 정적 객체의 초기화 Reference Effective C++ (항목 4) Contents 객체 초기화 멤버 초기화 리스트 비지역 정적 객체의 초기화 순서 int x; class Point { int x, y; }; Point p; C++에서 위의 코드처럼 객체를 선언할 때, 어떤 상황에서는 x나 p의 데이터 멤버의 초기화가 보장되지만, 어떤 경우에서는 초기화가 보장되지 않습니다. (Global에 초기화하는 경우 0으로 초기화되지만, 함수 내부에서 초기화하는 경우 초기화가 되지 않는 경우) 초기화되지 않은 값을 읽도록 내버려 둔다면 정의되지 않은 동작이 발생하게되고, 어떤 플랫폼의 경우에는 미초기화 객체를 읽기만 해도 프로그램이 멈추기도 하지만, 대부분의 경우에는 적당히 무작위 비트의 값을 일고 객체의 내부가 이상한 값을 .. 2021. 7. 26.
[C++] Const References Effective C++ (항목 3) Contents Const 키워드 상수 멤버 함수 비트수준 상수성(bitwise constness) / 물리적 상수성(physical constness) 논리적 상수성(logical constness) Const에 의한 오버로딩 함수의 코드 중복 문제 해결 Const 키워드 const를 사용하는 이유는 아마도 (소스 코드 수준에서 사용한)const 키워드가 붙은 객체는 외부에서 변경을 불가능하게 한다는 점과 컴파일러가 이러한 제약을 놓치지 않는 다는 점입니다. 어떤 값(객체의 내용)이 불변이어야 한다는 제작자의 의도를 컴파일러 및 다른 프로그래머와 나눌 수 있는 수단이 되는 것이죠. const 키워드는 아주 다양한 곳에서 사용할 수 있습니다. 클래.. 2021. 7. 26.
[C/C++] #define (선행처리자) References Effective C++ (항목 2) Effective C++에서 언급하고 있는 #define에 대해서 알아보겠습니다. 우선 아래의 코드를 썻다고 가정해봅시다. #define ASPECT_RATIO 1.653 우리가 코드를 볼 때에는 ASPECT_RATIO가 심볼릭 기호(Symbolic name)으로 보이지만 컴파일러에게는 전혀 보이지 않습니다. 이는 소스 코드가 컴파일러로 전달되기 전에 전처리기(preprocessor)가 ASPECT_RATIO를 전부 숫자 상수로 바꾸어 버리기 때문입니다. 그 결과, ASPECT_RATIO는 컴파일러의 심볼 테이블에 들어가지 않게 됩니다. 그래서 숫자 상수로 대체된 코드에서 ASPECT_RATIO와 관련되어 에러가 발생하게 된다면, 꽤 헷갈릴 수 있.. 2021. 7. 22.