[c++_13_1. 템플릿 함수]

·2022년 8월 30일
0

C++_Study

목록 보기
23/25

#220830~ 220902 ~

  • 템플릿, STL (Standard Template Library)

13-1. 템플릿 기본개념

  • template <>
template < class T> T Max(T i, T j)
{
    return i > j ? i : j;
};
int main()
{
    std::cout << "Max값은" << Max(1,2) <<std::endl;
    std::cout << "Max값은" << Max(7.5, 3.6) <<std::endl;
    std::cout << "Max값은" << Max('A','B') <<std::endl;
    return 0;
}

13-2. 템플릿 구현형식 (generic function)

  • 기능이 같은 함수들을 같은 이름으로 사용할 수있도록 한다.
  • 코드는 전혀 바뀌지 않고 형만 다른 함수를 필요로 한다면 템플릿을 사용하는 것 추천!

13-3. 템플릿 구현 예

ex1). 
template < class T> T Min(T n1, T n2)       // 자료형이 T
{
                       // 리턴형, 매개변수가 모두 T형
    return (n1<n2? n1:n2);
};

int main()
{
    int min_i;
    min_i=Min(3,6);
            //매개변수 자료형이 정수형으로 T는 int형이 됨 
    std::cout << min_i << "," << " ";
    
    double min_d;
    min_d=Min(10.3, 20.6);
            //매개변수 자료형이 double형으로 T는 double형이 됨 
    std::cout << min_d;
    return 0; 
}

// 3, 10.3

ex2). 
// 같은형, 두개 다른 자료형 다 들어가도 다양하게 문제없이 출력 가능 
template < class T1, class T2> void fun(T1 x, T2 y)       
{   // 두개에 대한 자료형이 T1, T2로 서로 다르다
    std::cout << x << " " << y << "" << std::endl;
};

int main()
{
    fun("Han", 30); //T1은 문자열(cosnt char *), T2는 정수형(int)
    fun(25, 50.5);  //T1은 정수형(int), T2는 double형
    return 0;
}

13-4. 함수 호출방식 call by value

int add(int x, int y);

int main(void)
{
    int sum; 
    sum=add(5,10);
    //함수를 호출할때 사용하는 매개변수인 (5,10) 실매개변수 - 'argument'
}

int add(int x, int y) // 함수 정의시 사용하는 x,y는 형색매개변수 - 'parameter'
{
    //x에 5, y에 10이 전달됨
    return (x+y);
}
  • call by value (변수의 값을 가지고 호출)
int sum(int x, int y);              //int sum(int, int);
int main()
{
    int a=2, b=5, c;
    c=sum(a,b);
    std::cout << a << " " << b << " " << c << std::endl;        // 2, 5, 14
    return 0;
}

int sum(int a, int b)               // a, b에 2,5가 넘어옴
{
    a=a+2;                          // 이곳의 a와 main함수의 a는 전혀 다른 변수
    b=b+5;
    std::cout << a << " " << b << " ";
    return(a+b);
}

13-5. 포인터와 call by reference

포인터: 메모리의 주소, 번지, address

  • 어떻게 사용되는지에 따라 다름
int x=10, y;	// 정수형 변수 x,y 선언
int *px; 		// 포인터 px선언, 선언문에서 *는 포인터 선언하는 구두점

px=&x;			// 정수형 변수. x의 주소를 포인터 px에 대입
y=*px;			// 실행문에서 *는 참조 연산자 
				// * 포인터 변수에 저장된 주소로 가서 실제 데이터값을 가져와라 

px에 저장된 주소(&x)로 가서 값 (x의 내용)을 가져오므로 y=10이 됨. 
  • 포인터

  • 실매개변수의 주소를 형식매개변수로 전달

  • 함수 호출 할 때

    • swap(&a, &b)
    • 실매개변수는 변수의 주소를 전달
  • 함수 정의 시

    • swap(int pa, int pb)
    • 형식매개변수는 주소를 받아야 하므로 포인터 변수로 받음
  • 형식매개변수가 변하면 실매개변수도 변함

  • return 값이 여러 개 이거나 배열 전체를 전달하는 경우 사용

13-6. 포인터로 call by refernce 예제

  • 정말 정말 중요함 !!!!!!!!!!!!!!!!!
void swap(int *a, int *b);

int main(void)
{
    int a=2, b=5;
    std::cout << a << " " << b <<  std::endl;
    
    // call by reference 인 주소를 넘겨야 함
    swap(&a, &b);
    std::cout << a << " " << b << std::endl;
    return 0;
}

// 주소를 받아야해서 * 포인터 변수로 
void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
    std::cout << *a << " " << *b << std::endl;
}
2 5
5 2
5 2
// 예제2 (call by reference)
void ss(int, int, int*, int*);

int main()
{
    int a=2, b=5;
    int sum=0, sub=0;
    std::cout << sum << sub << '\n';

    // 주소로 넘기는 이유?  밑에서 변경된 값을 다시 가져오고싶다! 
    ss(a,b,&sum,&sub);
    std::cout << sum << sub << '\n';    // 7-3
    return 0;
}
void ss(int a, int b, int *psum, int *psub) //main의 sum변수의 주소를 받는 포인터 변수
{   
    // psum 변수의 주소로 가서 그 값으로 a+b를 저장
    *psum=a+b;
    *psub=a-b;
}
0 0
7 -3 
profile
Hakuna Matata

0개의 댓글

관련 채용 정보