김로그 개발 잘 하고 싶다

3. Generics & Fucntions



Coursera에서 제공하는 C++ for C programer 를 보고 포스팅을 하고 있습니다. :)


C++의 함수에서 새롭게 다음 항목들이 새롭게 추가 되었다.

  • default parameters, variable arguemnt lists
  • const parameters
  • multiple Types in a generic
  • operator overloading
1
2
3
4
5
6
7
8
9
double sum(double data[], int size)
{
  double s = 0.0; // 리턴값
  int i;          // 루프 변수
  for(i = 0 ; i < size ; ++i)
    s += data[i];

  return s;
}

C 에서 함수를 작성할 때 리턴형의 자료형과 매개변수의 자료형을 선언했다. 1차원 배열의 원소의 합을 구하는 함수를 작성해 보았다. 배열의 주소와 크기를 전달인자로 받아오는데 배열의 주소는 double data[] 혹은 double *data로 받아온다.

C++에서는 다음과 같이 generic하게 작성할 수 있다.

1
2
3
4
5
6
7
8
template <class T> // T는 generic Type
T sum(const T data[], int size, T s=0)
{
  for(int i = 0 ; i < size ; ++i)
    s += data[i]; // += 연산자는 T에 대해서 수행되어야 한다.

  return s;
}

C와 C++로 작성한 함수를 비교해보자. 우선 metavariable T를 선언하였다. T를 통해 전달되는 인자가 int, double 등 다양한 자료형이 들어오더라도 함수가 수행된다. 한 가지 특이한 점은 함수 선언 마지막 부부인데 T s = 0 이다. C++에서는 매개변수의 기본값을 설정할 수 있는데 아무것도 전달 받지 않으면 설정한 값으로 초기화 된다.
그리고 반복문에서 변수를 선언할 수 있는데 코드 블럭 내에서 선언한 지역변수와 같은 역할을 한다.


Multiple Template Argument

1
2
3
4
5
6
template <class T1, class T2>
void copy(const T1 source[], T2 destination[], int size)
{
  for(int i = 0 ; i < size ; ++i)
    destination[i] = static_cast<T2>(source[i]);
}

safe casting 을 해주지 않으면 작동하지 제대로 작동하지 않는다. C++에서는 C와 비교하여 자료형에 대한 안정성이 향상되었다. C에서 형변환 type casting을 할 경우 종종 오류가 일어나는데 C++에는 여러가지 type casting을 통해 이 부분이 향상되었다.

종류 특징
static_cast considered safe
reinterpret_cast highly unsafe
dynamic_cast used with classes
const_cast cast away const-ness

reference