Dev/C++

최소 완전한 클래스를 만들어라

OOP는 능숙되지 않은 프로그램머에게 나쁜프로그램을 못하게 하는 것이다 # OOP는 데이터와 그 데이터를 조작하는 오퍼레이터를 캡슐화 함으로서 은닉화를 통한 데이터 보호와 추상화를 통한 인터페이스 노출, 상속을 통한 코드 재활용으로 견고하고 융통성있는 프로그램을 만들기 위한 좋은 개념입니다. 그 구체화된 도구가 class 입니다. 최소 완전한 class를 만들어라 #Effective C++에서는" 최소 완전한 class를 만들어라 " 라고 얘기 하고 있습니다. 이 얘기는 첨에 이야기한 나쁜프로그램을 못하게하는 것과 일맥 상통하는 내용입니다. 작은 클래스라도 최소 인터페이스라도 완전한 클래스를 구현하는 내용입니다. 그 내용에는 다음과 같은 것들이 있을것입니다. 생성 소멸 복사및 대입 상속 생성 #디폴트 생..

2008.05.01 게시됨

Dev/C++

RAII (Resource Acquisition Is Initialization)

Resource Acquisition Is Initialization #직역하면 자원의 획득은 초기화이다 .. 이말은 C++계의 대부 Bjarne Stroustrup 에 의해 나온 관용구 입니다. http://www.research.att.com/~bs/homepage.html 자원(여기서 자원이란 메모리 뿐만 아니라 OS에 요청에서 얻어지는 모든건 ..)의 소멸(해제)은 Destructor(소멸자)에서 처리 하라는 말과 일맥 상통하는 말입니다. 자원의 획득은 생성자에서, 그 자원의 소멸은 소멸자에서 처리하여 어떠한 경우에도 자원의 leak이 발생하지 않게 처리하자 란 생각입니다. 만약 다음과 같은 코드가 쓰레드의 함수안에서 실행 되고 있을때 ... CRITICAL_SECTION g_cs; UINT Ru..

2008.05.01 게시됨

Dev/C++

STL

STL #Standard Template Library STL은 Alexander Stepanov가 Meng Lee와 함께 template으로 구현한 라이브러리 입니다. 1993년 표준화가 이루어질쯤 Alexander Stepanov의 STL을 보고 C++ 표준 위원회의 만장 일치에 의해서 표준에 합류 하게 되었고 STL로 인해 표준화는 몇년 늦어진 1998년에야 이루어 지게 됬습니다. (이 기간 언어적인 확장은 없었으며 explicit 같은 제한적인 사항이 몇개 추가 되었습니다.) STL은 공식적인 용어라기 보다 관용적으로 쓰는 C++의 라이브러리 입니다. STL의 범위는 C++의 표준 라이브러리중 알고리즘과 Iterator를 사용하는 컨테이너 객체를 일반적으로 말합니다. STL의 의의중 하나는 C++..

2008.05.01 게시됨

Dev/C++

new 2

new의 실패 #new 키워드의 메모리 할당은 operator new 함수에 의해 처리가 됩니다. 이 operator new 함수의 실패는 ISO C++표준 이전에는 NULL을 리턴하게 되었으나 ISO C++표준에서는 std::bad_alloc 객체를 예외로 발생 시키는 것으로 결정 되었습니다. #include #include using namespace std; int main() { try { // 실패한다면 std::bad_alloc 예외 발생 int *p = new int[10000000]; // 구식 컴파일러라면 이 조건에 .. if (!p) { cout

2008.05.01 게시됨

Dev/C++

new 1

new #new 키워드는 C++에서 힙영역에 메모리를 할당하기 위해 사용됩니다. 힙영역이란 프로그램(프로세스)이 메모리에 로딩이 될때 사용되는 메모리영역(정적영역, 스택, 코드영역) 을 제외하고 OS 차원에서 허용해주는 메모리 영역입니다. 그래서 힙영역은 프로그램차원에서 다룰수 있는 영역이 아니므로 OS에게 요청을해서 메모리를 받아와야 됩니다. C언어의 malloc 함수와 C++의 new는 OS에게 그런 요청을 해서 메모리는 얻어오는 함수및 키워드 입니다. new는 클래스 객체의 생성자를 호출해준다는 점에서 malloc 함수와는 차별화가 됩니다. #include using namespace std; class Item { public: Item() { cout

2008.05.01 게시됨

Dev/C++

initialization - array structure

배열및 구조체의 초기화 # // 3개의 원소를 각각 1, 2, 3 으로 초기화 int nArr[3] = { 1, 2, 3 }; // 4개의 원소를 가지는 배열 4개를 1, 2, 3, 4 로 초기화 // 이때 배열의 개수는 4개로 자동으로 정의됨 int nArr[] = { 1, 2, 3, 4 }; struct St { int a; int b; }; // 구조체 St의 멤머 a, b를 각각 1, 2로 초기화 St st = { 1, 2 }; // 구조체의 배열 초기화 St st[2] = { { 0, 1 }, { 2, 3 } }; 초기화 되지 않은 auto 변수는 정의되지 않은 값을 가진다 # // 어떤값이 들어있는지 정의되지 않았음 int nArr[3]; St st; St st[2] ; // 물론 배열및 구조..

2008.05.01 게시됨

Dev/C++

operator overloading 2

operator->() #"->"의 연산자 겹지정은 포인터를 리턴으로 하는 형식을 취하고 있으며 리턴되는 포인터의 "->" 연산자를 사용한 효과를 내는 특이한 특성을 가지고 있습니다. 이러한 형식으로 operator->() 함수의 리턴되는 포인터의 멤버를 제어할 수 있는 능력을 부여합니다. #include #include using namespace std; template class SmartPtr { public: explicit SmartPtr(T *p = 0) : p_(p) {} virtual ~SmartPtr() { delete p_; } T* operator->() { return p_; } // 아래의 두개의 함수인 "!" 연산자 겹지정 함수와, // bool 타입으로의 변환연산자 함수는 융..

2008.05.01 게시됨

Dev/C++

operator overloading 1

operator overloading #연산자 겹지정은 c++의 사용자 정의 타입 - class - 에 기본타입의 인터페이스를 부여할때 사용합니다. 예를들어 집합 객체에 "+" 연산자를 이용해서 합집합을 구현한다던가 스트림 객체와의 인터페이스를 위해 "" 를 구현하는것이 여기에 속합니다. 연산자 겹지정은 연산자 마다 각각 그 의미에 맞게 구현 할수도록 규칙이 존재합니다. 예를들어 +, -, /, * 연산자는 각각 의미에 맞에 2항 연산자로서 사용이 되야하며 +, - 는 더불어 부호를 표시하는 단항 연산자로서 사용할수 있고 *는 포인터가 가르키는 의미로서의 단항연산자로 사용이 가능합니다. 그럼 이걸 어떻게 다 외우느냐 라고 생각이 드실지 모릅니다. 그때 쉽게 적용하는 방법은 Scott Meyers의 연산자..

2008.05.01 게시됨

Dev/C++

Conversion Functions - 변환함수

Conversion Functions #변환함수 객체를 특정한 타입으로 암시적으로 변환할수 있는 능력을 부여하는 함수입니다. class String { public: /* ... */ // 변환함수 // 암시적으로 const char* 타입으로 변환하게 합니다. operator const char*() { return pstr; } private: char *pstr; }; int main() { String str; // 변환 함수가 사용됩니다. const char *pstr = str; } 변환함수는 많은 융통성을 제공하고 프로그램하는데 있어 좋은 인터페이스를 제공합니다. 허나 변환함수는 많은 함정을 가지고 있습니다. 의도적이지 않는 형변환으로 인하여 문제를 야기 할수 있습니다. #include us..

2008.05.01 게시됨

Dev/C++

explicit

explicit #암시적으로 클래스 타입으로의 형변환을 막는 키워드 입니다. 비교적 C++표준의 후반부에 채택된 사항이며 클래스의 생성자에 사용하는 키워드 입니다. 어떤 타입(객체)에서 특정 타입으로의 암시적인 형변환은 파라미터가 1개인 생성자에 근거하여 이루어 집니다. #include using namespace std; class CInt { public: CInt() {} CInt(int n) : n_(n) {} ~CInt() {} operator int() { return n_; } private: int n_; }; int main() { CInt Number; // 파라미터가 1개인 생성자인 // CInt(int n)에 근거하여 암시적인 // 형변환이 이루어 집니다. Number = 34; /..

2008.05.01 게시됨

Dev/C++

template

generic #template은 C++의 generic한 기능을 받쳐주는 핵심적인 도구입니다. 이 도구에 의해 탄생한 STL과 표준 라이브러리들은 확장성과 타입 안정성등의 이점으로 다른 언어의 라이브러리들과는 다른 진화된 디자인을 보여주고 있습니다. 이름 그대로 template은 타입에대한 명세서와 같습니다. template 자체가 타입이 아니고 타입에 대한 내용을 기술함으로서 타입생성에 틀이 되는 것입니다. 붕어빵을 예를들면 붕어빵에 팥을 넣느냐 아니면 계란을 넣느냐에 따라 붕어모양의 붕어빵이 나오느냐 붕어모양의 계란빵이 나오느냐와 같은 이치입니다. 그 붕어빵 틀이 template 입니다. template # #include using std::string; template T Add(T tp1, T..

2008.05.01 게시됨