본문 바로가기

C++ Programming/이것이 C++이다

C++ 문법~

 

 C++ 언어#

 

Scope Operator#
  • 전역
  1. ::printf("Hello, World\n");
  • 지역
  1. TestClass::testFunc();

 

Name mangling에서 return type을 사용하지 않는 이유#
  • 함수를 호출한 곳에서 return 값을 반드시 받지 않아도 상관 없기 때문에 compile-time에 return 값의 type을 확정판단할 수 없음

 

const 멤버 함수의 특징#
  • const 멤버 함수 내에서는 오로지 const 멤버 함수만 호출할 수 있다.
  • const 멤버 함수 내에서 반환할 수 없는 값들
    • 호출하는 객체의 포인터 또는 참조
    • 호출하는 객체 내의 멤버 속성의 포인터 또는 참조
    • 이 값들을 const로 casting 하여 반환하는 것은 가능
  • const 멤버 함수와 일반 멤버 함수의 overloading이 가능하다.
    • const object 또는 const 멤버 함수 내에서 호출하는 경우를 위해 사용
  1. class A
    {
    public:
       int sub(void) {};
       int sub(void) const {};
       void test(void);
       void const_test(void) const;
    };

    void A::test(void)
    {
       sub();  // sub()가 호출됨
    }

    void A::const_test(void) const
    {
       sub();  // sub() const가 호출됨
    }

 

Operator Overloading#
  • . .* :: ::* 연산자는 overloading 안됨
  • prefix, postfix 연산자의 overloading
  1. ++var -> operator++()
    var++ -> operator++(int dummy)

 

함수 개체#

 

  1. #include <iostream>

    using namespace std;

    struct Plus
    {
        int operator()(int a, int b)
        {
            return (a+b);
        }
    };

    int GetSum(int a, int b, Plus oper)
    {
        return oper(a, b);
    }

    void main(void)
    {
        Plus aa;
        cout << aa(3, 5) << endl;
        cout << GetSum(7, 8, Plus());
    }

 

클래스 멤버 포인터#
  • 자료형 클래스명::* 변수명
  1. class A
    {
    public:
        int no;
        char ch;
        void sub();
    };
    ...
    int A::* p = &A::no;
    A aa;
    aa.*p = 100;
    A* ap = &aa;
    aa->*p;

 

클래스 멤버 함수 배열#
  • 반환형 ({호출규약} 클래스명:: * 변수명[배열크기]) (인자, ...)
  • 초기화 방법

= { 클래스명::멤버함수명, ... };

  • 예제
  1. typedef int (Calc::* FP)(int, int);
    ...
    Calc calc;
    FP fp[4] = {(FP)0, Calc::plus, Calc::sub, Calc::mul};
    int key, n, k;
    cout << "Select operation(1 = plus, 2 = sub, 3 = mul): ";
    cin >> key;
    cout << "Input two numbers: ";
    cin >> n >> k;
    if(key > 0 && key < 4)
    {
        cout << "result: " << (calc.*(fp[key]))(n, k) << endl;
    }

 

RTTI(Run Time Type Information)#
  • operator typeid
  • class type_info
  • 예제
  1. #include <typeinfo>
    ...
    const type_info& tinfo = typeid(타입 또는 변수);
    cout << tinfo.name();

 

다양한 cast 연산자#
  • static_cast: 정수 -> 실수, 실수 -> 정수 등과 같이 논리적 변환이 가능한 경우에 대해 사용
  • dynamic_cast: 
    • down-cast의 유효성을 검사하는 용도로 사용
    • 사용하기 위해서는 compile option 중에 RTTI를 활성화 해야 함
  1. class A
    {
    };
    class B : public A
    {
    public:
        void func();
    }

    sub(A* p)
    {
        if(dynamic_cast<B*> p) // casting에 실패하면 NULL 반환
        {
            p->func();
        }
    }
  • const_cast: 상수 형식의 객체를 변수 형식의 객체로 변환함

 

Smart Pointer#
  • auto_ptr
  1. #include <memory>
    ...
    auto_ptr<int> p(new int);
    *p = 5;
    cout << *p;
  • 간단한 구현
  1. template<typename T>
    class Auto_Ptr
    {
        T* data;
    public:
        Auto_Ptr(T* data)
        {
            this->data = data;
        }
        virtual ~Auto_Ptr()
        {
            delete[] data;
        }
        T& operator * ()
        {
            return *data;
        }
        T& operator [](int index)
        {
            return data[index];
        }
    };
    ...
    Auto_Ptr<int> aptr(new int);
    *aptr = 5;
    cout << *aptr;