Dev/C++ 55

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] ; // 물론 배열및 구조..

Dev/C++ 2008.05.01

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 타입으로의 변환연산자 함수는 융..

Dev/C++ 2008.05.01

operator overloading 1

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

Dev/C++ 2008.05.01

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..

Dev/C++ 2008.05.01

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; /..

Dev/C++ 2008.05.01

template

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

Dev/C++ 2008.05.01

functor - 함수객체

functor # functor(함수객체)는 함수의 인터페이스를 지원하는 객체를 말합니다. 구체적으로 말하면 class에 operator()를 overloading하여 사용하는 관용구를 말합니다. #include #include using namespace std; class Adder { public: Adder() {} ~Adder() {} int operator()(int lvalue, int rvalue) { return nSum_ = (lvalue + rvalue); } int operator()(int value) { return nSum_ += value; } int Result() const { return nSum_; } private: int nSum_; }; int FnAdd(int ..

Dev/C++ 2008.05.01

Casting operators

Casting operators #C++에서는 4가지의 cast 연산자가 추가 되었습다. 물론 C언어와의 호환성을 위해 C언어의 문법도 지원합니다. 그러나 명확하고 보다 안전함 때문에 C++의 cast를 추천합니다. static_cast #사전적 의미는 런타임시 타입에 대한 체크와 cast가 이루어지는것이 아니고 컴파일시에 체크와 cast되는 연산자 일반적으로 C언어의 형변환이 여기에 속합니다. 그리고 base 클래스에서 derived 클래스로의 down cast시에도 이용되는데 런타임시 타입을 체크하지 않고 cast가 되기 때문에 오버헤드는 없으나 잘못된 포인터로 인한 위험은 존재합니다. class Base {}; class Derived : public Base {}; void f(Derived *p..

Dev/C++ 2008.05.01

export

export #C++ template의 내보내기 키워드 입니다. 아직 제대로 구현되어 있는 컴파일러는 없습니다. template은 타입이 정의 되지 않은 상태의 함수나 객체를 컴파일 타입에 정의를해서 코드를 생성하는 일종의 코드제너레이터 같은 것입니다. template class TClass { T t; }; 위의 코드는 TClass intClass 란 식으로 인스턴스를 만들기 전까지는 혹은 함수 같은 경우 사용되지 전까지는 코드를 만들지 않습니다. 아마 아래와 같은 코드를 컴파일 당시 만들것입니다. class TClass { int t; }; 그도 그럴것이 타입을 모르는데 어떻게 코드를 만들겠습니까? 그렇다고 모든 타입에 대해서(사용자정의 타입까지 한다면 헉..)다 코드를 만들수는 없는 노릇이고 .....

Dev/C++ 2008.05.01

main function

main Function #ISO C++의 공식 main함수의 원형은 아래와 같습니다. int main() int main(int argc, char *argv[]) 두개의 원형이 아닌이상 모두 표준에 어긋나는것입니다. 표준화이전에 쓰여진 책 혹은 컴파일러에서는 void main() 이란 원형도 타탕하다는 주장이 있었습니다. 그러나 그것은 표준에 어긋납니다. VC++ 같은 컴파일러는 void main()을 허용하지만 하위호환성을 위해 남겨 놓은 것 뿐입니다. return #표준 main함수는 int를 리턴하게 되어 있습니다. int main() { return 0; } 허나 ISO C++에서는 main함수에서의 명시적인 리턴이 없으면 자동으로 return 0;를 자동으로 넣어줍니다. // 이 main은 ..

Dev/C++ 2008.05.01