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#
- . .* :: ::* 연산자는 overloading 안됨
- prefix, postfix 연산자의 overloading
- ++var -> operator++()
var++ -> operator++(int dummy)
- Overloading 'operator new' in C++: http://www.bearcave.com/software/c++_mem.html
함수 개체#
- #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;