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;