정리 노트‎ > ‎

C++ 언어

Scope Operator

  • 전역
    ::printf("Hello, World\n");
  • 지역
    TestClass::testFunc();
 

Name mangling에서 return type을 사용하지 않는 이유

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

const 멤버 함수의 특징

  • const 멤버 함수 내에서는 오로지 const 멤버 함수만 호출할 수 있다.
  • const 멤버 함수 내에서 반환할 수 없는 값들
    • 호출하는 객체의 포인터 또는 참조
    • 호출하는 객체 내의 멤버 속성의 포인터 또는 참조
    • 이 값들을 const로 casting 하여 반환하는 것은 가능
  • const 멤버 함수와 일반 멤버 함수의 overloading이 가능하다.
    • const object 또는 const 멤버 함수 내에서 호출하는 경우를 위해 사용
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

 

함수 개체

#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());
}
 

클래스 멤버 포인터

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

클래스 멤버 함수 배열

  • 반환형 ({호출규약} 클래스명:: * 변수명[배열크기]) (인자, ...)
  • 초기화 방법
    = { 클래스명::멤버함수명, ... };
  • 예제
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
  • 예제
#include <typeinfo>
...
const type_info& tinfo = typeid(타입 또는 변수);
cout << tinfo.name();
 

다양한 cast 연산자

  • static_cast: 정수 -> 실수, 실수 -> 정수 등과 같이 논리적 변환이 가능한 경우에 대해 사용
  • dynamic_cast: 
    • down-cast의 유효성을 검사하는 용도로 사용
    • 사용하기 위해서는 compile option 중에 RTTI를 활성화 해야 함
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
#include <memory>
...
auto_ptr<int> p(new int);
*p = 5;
cout << *p;
  • 간단한 구현
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;
 
Comments