Effective C++

[Effective C++] #20 값에 의한 전달, 참조자에 의한 전달 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 4장 "설계 및 선언", 항목 21 "함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 들지 말자"에 해당하는 내용입니다. 참조자를 반환하는 함수 class Rational { public: Rational(const int numerator, const int denominator) :n(numerator), d(denominator){} private: int n, d; friend const Rational operator*(const Rational& lhs, const Rationa..
[Effective C++] #20 값에 의한 전달, 참조자에 의한 전달 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 4장 "설계 및 선언", 항목 20 "값의 의한 전달보다 상수 객체 참조자에 의한 전달 방식을 택하는 편이 대개 낫다"에 해당하는 내용입니다. 값에 의한 전달 C++는 함수로부터 객체를 전달받거나, 함수에게 객체를 전달할 때 '값에 의한 전달' 방식을 사용합니다. '값에 의한 전달'은 함수의 매개 변수를 전달받은 인자의 사본을 통해 초기화됩니다. 더불어 반환 값 또한 함수가 반환한 값의 사본입니다. 사본을 만드는 동작은 복사 생성자의 호출을 의미하죠. 이러한 점 때문에 '값에 의한 전달'은 비효율..
[Effective C++] #19 클래스 설계 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 4장 "설계 및 선언", 항목 19 "클래스 설계는 타입 설계와 똑같이 취급하자"에 해당하는 내용입니다. 클래스 설계 함수와 연산자를 오버로드 하고, 메모리 할당 및 해제를 제어하며, 객체 초기화 및 소멸을 정의하는 작업이 클래스 설계입니다. 몇 가지 질문들에 대해 고찰하며, 효과적인 클래스 설계에 대한 방향을 짐작해 보겠습니다. 1. 객체 생성 및 소멸은 어떻게 이루어지는가? 이 질문을 통해, 우리는 클래스 생성자 및 소멸자의 설계를 준비합니다. 더불어, 메모리 할당 함수를 직접 작성할 경우에도 영향을 미칩니다. 2. ..
[Effective C++] #18 인터페이스 설계 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 4장 "설계 및 선언", 항목 18 "인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자"에 해당하는 내용입니다. 인터페이스 이번 항목에서 다룰 "인터페이스"란, C++에서 제공하는 "__interface" 혹은 추상 클래스로 특정 짓는 것이 아니라, 사용자가 코드 작성 시 사용하는 함수, 클래스, 그리고 템플릿 등을 의미합니다. 인터페이스의 정의가 의미하는 바, 그 자체를 의미합니다. 건물을 짓기 위한 기반 및 자재들이라고 볼 수 있죠. 책에서 설명하는 인터페이스 설계의 궁극적인 목적은 사용자가 원하..
[Effective C++] #17 자원 관리 객체와 new 사용 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 3장 "자원 관리", 항목 17 "new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자"에 해당하는 내용입니다. 자원 관리 객체의 메모리 동적 할당 void someFunc (std::tr1::shared_ptr, int priority){ ... }; int priority = 1; someFunc(std::tr1::shared_ptr(new A_클래스), priority); 위 예제 코드는 동적으로 할당받은 A_클래스 객체에 대한 자원 관리 객체(shared_ptr)와 정..
[Effective C++] #16 new 및 delete 사용 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 3장 "자원 관리", 항목 16 "new 및 delete를 사용할 때는 형태를 반드시 맞추자"에 해당하는 내용입니다. 동적 할당 코드 작성 중 일시적으로 필요한 만큼의 자원을 할당받고 불필요한 자원 낭비를 방지하는 메모리 할당 방법입니다. 우리가 작성한 program이 정상적으로 실행되기 위해 메모리 공간이 필요합니다. 이때, 프로세스의 runtime 중 필요한 메모리 크기만큼을 컴퓨터에 일려 줌으로써 자원을 보다 효율적으로 사용할 수 있도록 해줍니다. 동적 할당은 heap 영역에서 이루어지고, new를 ..
[Effective C++] #15 자원 관리 객체, 자원에 대한 접근 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 3장 "자원 관리", 항목 15 "자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자"에 해당하는 내용입니다. 자원 관리 객체, 그리고 자원에 대한 접근 자원 관리 객체는 외부(API)에서 해당 자원을 접근할 수 있도록 허용해야 합니다. 물론, 외부의 접근을 허용하는 행동은 캡슐화에 위배되는 행동입니다. 하지만, 자원 관리 객체의 목적은 자원을 외부로부터 숨기기 위함이 아니라, 성공적으로 자원 해제를 수행하기 위 위함입니다. 자원 관리 객체의 자원들에 접근하는 방법은 두 가지가 있..
[Effective C++] #14 자원 관리 객체 심화 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 3장 "자원 관리", 항목 14 "자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자"에 해당하는 내용입니다. 자원 관리 객체의 복사 class Lock { public: Lock (Mutex* pm) : mutexPtr(pm) {lock(mutexPtr);} ~Lock(){unlock(mutexPtr);} private: Mutex* mutexPtr; } #include using namespace std; int main() { Mutex m; Lock m1(&m); ...// m1 객체의 소멸자 호출 및..
[Effective C++] #11 중복 참조와 자기 대입 연산자 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 2장 "생성자, 소멸자 및 대입 연산자", 항목 11 "operator=에서는 자기 대입에 대한 처리가 빠지지 않도록 하자"에 해당하는 내용입니다. 중복 참조에 의한 자기 대입 연산 class Wclass {...}; Wclass w; ... w = w; *px = *py;// 서로 같은 객체를 가리킬 수도 ... a[i] = a[j]; // 같은 값일 수도... 보통 자기 대입 연산은 적법한 코드로 분류됩니다. 쉽게 말해, 사용자 쪽에서 문제가 발생한지 모를 수 있죠. 위 예제 코드는 일단 보기에 크게..
[Effective C++] #10 대입 연산자와 *this의 참조자 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 2장 "생성자, 소멸자 및 대입 연산자", 항목 10 "대입 연산자는 *this의 참조자를 반환하게 하자"에 해당하는 내용입니다. 대입 연산자 대입연산자 = { =, *=, /=, %=, +=, -=, =, &=, ^=, |= } class A { public: ... A& operator=(const A& 우변객체){ ... return *this; } }; 대입 연산자는 위 코드에서 살펴본 대로, "= *= /= %= += -= = &= ^= |="를 의미합니다. "="의 경우 단순 할당 연산자로..
Hardii2
'Effective C++' 태그의 글 목록 (2 Page)