overloading

:함수의 이름은 동일하나 매개변수의 type과 개수에 따라 다른함수로 인식 가능하다. return type은 고려하지않는다.

(signature=함수이름+매개변수. 즉 signature가 다르면 다른함수로 인식한다.)

ex)

1)abs (int)

2)abs (double)

3)abs (float)

1,2,3,은 각각 다른 함수이다. 하지만 사용이가능하다. 이는 overloading의 특성을 이용한 것이다.

overloading을 통하여 동일 명의 함수를 여러개 선언하는 경우 내용(body)는 동일하게 하는 것이 약속이다.

compatible

:변수 알아서 조정. promotion, demotion으로 나뉜다.

promotion:int -> double처럼 한단계 up 하는 것. data손실이 없다.

demotion:double->int처럼 한단계 down 하는 것. data 손실이 있다.(내림)

-->이러한 promotion 과 demotion은 최대한 피해주도록한다. type에 주의한다

default argument

:매개변수에 default값 적용하기

사용방법

=를 넣어주면된다.

이때 함수의 선언부분에서만 default값 설정이 가능하다.

default를 받는 구조

(int a1=1, int a2=2, int a3=3) 라는 함수가 있을 때

함수에서

funtiontest(1,2)-->이런식으로 써주었을 때 함수는 앞부터 숫자를 받게 되어 맨뒤 a3는 default값이 나오게된다.

이러한 특성으로 인해

(int a1=1, int a2, int a3)

이런식으로 쓴후에 funtiontest(1,2) 이런식으로 쓰게되면 함수는 1을 a1, 2를 a2에 저장해주게 된다.

a3는 default가 설정되있지 않으므로 본 파일은 애러가 뜬다.

따라서 default할때 주의점

1)선언에서 뒤쪽 매개변수부터 default값을 설정해주어야한다.

2)중간만 default설정은 불가능하다.

3)함수 호출시 앞쪽(왼쪽)부터 순차적으로 변수가 체워짐에 유의하자.

overloading, default 응용 코딩

문제

1) 더블타입의 pSample[5] = { 0.3,0.6,0.1,0.4,0.8 }; 이러한 배열이 있을 때

임의의 숫자 k를 입력한다.

그러면 k와 pSample[5]의 차이중 가장 작은 pSample[m]을 출력하고 그때의 차이를구하라

2) 1)과 동일하지만 이를 int형으로 받는다. 이때 함수의 이름은 1)과 동일하다(overloading). 또한 default를 이용하여 true이면 두수의 차이를 출력하고 false이면 pSample-target이 가장 작은 수를 출력하도록 지정하라.

#include "stdafx.h"

#include<iostream></iostream>

using namespace std;

//array를 reference 로 넘기기

double FindClosetPoint(double pSample[], int nSizeOfArray, double target, double& nearest)

{

int i;

int line = 0;

double val;

double ab[5];

double diff;

for (i = 0; i < 5; i++)

{ //ab배열에 숫자의 차이를 쭉 써주고

val = target - pSample[i];

ab[i] = abs(val);

}

//, 가장 차이가 작은것을 for 문을 통하여 . if를써서 저장될때 값을

// 한변수에 넣고 그때의 diff에 저장. 만약 ab의 배열이

diff = ab[0];

for (i = 0; i < 5; i++)

{

if (diff >= ab[i])

{

diff = ab[i];

line = i;

}

}

nearest = pSample[line];

return diff;

}

int FindClosetPoint(int pSample[], int nSizeOfArray, int target, int& nearest,bool bAbsDiff=true)

{

int i;

int arr[5];

int value=0;

int diff;

if (bAbsDiff == true)

{

for (i=0;i<5;i++)

{

arr[i] = abs(pSample[i]-target);

}

for (i = 0; i<5; i++)

{

value = arr[value] < arr[i] ? value : i;

}

diff = pSample[value] - target;

nearest = pSample[value];

return diff;

}

else

{

//arr[i]에 샘플과 타겟값의 차를 구한다.

for (i = 0; i<5; i++)

{

arr[i] = pSample[i] - target;

}

//arr[i]중 가장큰값이 몇번째 항인지 구한다.

for (i = 0; i<5; i++)

{

value = arr[i] > arr[value] ? value : i;

}

diff = pSample[value] - target;

nearest = pSample[value];

return diff;

}

}

int main()

{

double pSample[5] = { 0.3,0.6,0.1,0.4,0.8 };

double target;

double diff;

cout << "typing double type number here:";

cin >> target;

int nSizeOfArray = 5;

double nearest;

diff = FindClosetPoint(pSample, nSizeOfArray, target, nearest);

cout << "difference:" << diff << endl << "nearest value:" << nearest<<endl;

int pSampleInt[5] = { 3,6,1,4,8 };

int inttarget;

int intdiff;

cout << "typing int type number here:";

cin >> inttarget;

int intnearest;

intdiff = FindClosetPoint(pSampleInt, nSizeOfArray, inttarget, intnearest, false);

cout << "difference:" << intdiff << endl << "nearest value:" << intnearest;

return 0;

}

+ Recent posts