C언어에는 매크로 함수라는 기능이 있다.

크로 함수의 대표적인 장점은 "일반적인 함수에 비해서 실행속도의 이점이 있다" 이다.

단점으로는 "정의하기가 어렵다. 복잡한 함수를 매크로 형태로 정의하는데 한계가 있다" 이다.


C++언어에는 이러한 매크로 함수의 장점은 유지를 하되 단점은 제거한 기능이 있다.

바로 인라인(Inline) 함수 이다. 코드를 보자.


- InlineFuce1.cpp -


#include <iostream>


using namespace std;


inline int SQUARE(int x)

{

return x*x;

}


int main(void)

{

cout << SQUARE(5) << endl;

cout << SQUARE(12) << endl;


return 0;

}


실행화면





이러한 인라인 함수도 매크로 함수의 장점을 완전히 대체하지 못하였다.

그것은 데이터의 손실 이다. 예를 보면서 설명 하겠다.


#define SQUARE(x) ((x)*(x))


cout << SQUARE(12);    int형 함수호출

cout << SQUARE(3.15);  duble형 함수호출


위와 같이 실행을 하면 다음과 같이 변환이 이뤄져서

어떠한 경우에도 데이터의 손실이 발생하지 않는다.


cout << ((12)*(12));       int형 함수호출

cout << ((3.15)*(3.15));  duble형 함수호출


하지만 다음과 같이 정의된 인라인 함수의 경우에는...


inline int SQUARE(int x) { return x*x }


int형 기반으로 정의된 함수이기 때문에 다음의 함수호출 문장에서 데이터 손실이 발생한다.


cout << SQUARE(3.15); //0.15가 손실되어서 3 X 3의 결과인 9가 출력!


이러한 문제를 해결하기 위해서 C++의 템플릿이라는 것을 이용하면 매크로 함수와 마찬가지로 자료형에 의존적이지 않는 함수가 완성된다. 템플릿은 이후에 서적을 참고하여 이후 글에서 다시 소개하겠다.


대신 서적에 있는 간단한 예시를 통해 맛을 보자.


#inlcude <iostream>


using namespace std;


template <typename T>

inline T SQUARE(T x)

{

return x*x;

}


int main(void)

{

cout << SQUARE(5.5) << endl;

cout << SQUARE(12) << endl;


return 0;

}


위 코드를 실행해보면 데이터 손실이 없는 것을 볼 수 있다.

'[C], [ C++]' 카테고리의 다른 글

[흑역사] - 너구리 게임  (0) 2016.03.30
이름공간(namespace[네임스페이스]) 소개  (0) 2016.02.21
매개변수의 디폴트 값  (0) 2016.02.21
STL - list 사용 예시 예제  (0) 2016.02.19
함수 오버로딩  (0) 2016.02.18

C++에서는 디폴트 값이라는 것을 설정할 수 있다. 여기서 말하는 디폴트 값이란 기본적으로 설정되어 있는 값을 의미한다. 아래 각 예제 코드들을 가지고 해보길 바란다. 본론으로 들어가겠다.


- DefaultValue1.cpp -


#include <iostream>


using namespace std;


int Adder(int num1 = 1, int num2 = 2) // Adder함수의 인자값의 디폴트 값이 1, 2로 설정되어 있다.

{

return num1 + num2;

}


int main(void)

{

cout << Adder() << endl;

cout << Adder(5) << endl;

cout << Adder(3, 5) << endl;


return 0;

}


실행결과






- DefaultValue2.cpp -


#include <iostream>


using namespace std;


int Adder(int num1 = 1, int num2 = 2);

// Adder함수의 선언부 인자값의 디폴트 값이 1, 2로 설정되어 있다.


int main(void)

{

cout << Adder() << endl;

cout << Adder(5) << endl;

cout << Adder(3, 5) << endl;


return 0;

}


int Adder(int num1, int num2)

{

return num1 + num2;

}


실행결과





- DefaultValue3.cpp -


#include <iostream>


using namespace std;


int BoxVolume(int length, int width = 1, int height = 1);


int main(void)

{

cout << "[3, 3, 3] : " << BoxVolume(3, 3, 3) << endl;

cout << "[5, 5, D] : " << BoxVolume(5, 5) << endl;

cout << "[7, D, D] : " << BoxVolume(7) << endl;

// cout << "[D, D, D] : " << BoxVolume() << endl;


return 0;

}


int BoxVolume(int length, int width, int height)

{

return length*width*height;

}



실행화면





- 문제 -

다음과 같은 형태로의 함수 오버로딩은 문제가 있다. 어떠한 문제가 있는지 설명해보자


int SimpleFunc(int a = 10)

{

return a + 1;

}


int SimpleFunc(void)

{

return 10;

}


해답(아래 빈부분을 드래그하면 보입니다.)

함수를 호출할 때 인자값을 전달하지 않고 함수를 호출하는 경우. 두 함수 모두 호출조건을 만족하기 때문에 컴파일 에러가 발생한다.

'[C], [ C++]' 카테고리의 다른 글

이름공간(namespace[네임스페이스]) 소개  (0) 2016.02.21
인라인(Inline) 함수  (0) 2016.02.21
STL - list 사용 예시 예제  (0) 2016.02.19
함수 오버로딩  (0) 2016.02.18
STL - map 사용 예시 예제  (0) 2015.05.28

#include <iostream>

#include <list>


using namespace std;


//사용할 구조체.

struct Temps

{

int a;

int b;

};


void main()

{

list<Temps> mylist;//리스트 변수.


for (int i = 0; i < 10; i++)

{

Temps s;//임시 사용할 구조체 변수.

s.a = i * 10;//구조체 내부 변수값 수정.

mylist.push_back(s);//리스트 변수에 삽입.

}


list<Temps>::iterator iter = mylist.begin();

  //반복자 생성 및 리스트 변수의 처음 위치값을 연결해준다.


while (iter != mylist.end())//반복자가 리스트의 끝을 만날때까지 계속 반복한다.

{

Temps a = *iter;//반복자 변수 주소값을 넘긴다.

cout << a.a << endl;//화면에 출력

iter++;//반복자 주소값 쉬프트.

}

}

'[C], [ C++]' 카테고리의 다른 글

인라인(Inline) 함수  (0) 2016.02.21
매개변수의 디폴트 값  (0) 2016.02.21
함수 오버로딩  (0) 2016.02.18
STL - map 사용 예시 예제  (0) 2015.05.28
단순 파일 입출력 함수 코드  (0) 2015.05.28

+ Recent posts