[c++_13-2. 템플릿 함수]

·2022년 9월 6일
0

C++_Study

목록 보기
24/25

#13-7. call by reference 구현방법 포인터 vs reference

ex1). 포인터를 사용하는 방법 (call by reference)

//2,5       5,2             5,2
void swap(int *, int *);

int main()
{
    int a=2, b=5;
    std::cout << a << " " << b << '\n' << std::endl;        
    //a의 주소값, b의 주소값 둘이 바뀜! 
    swap(&a, &b);            // 실 매개변수를 주소로 전달
    std::cout << a << " " << b << '\n' << std::endl;
    return 0;
}

void swap(int *pa, int *pb)  // 형식 매개변수가 포인터 변수
{
    //int *pa=&a, int *pb=&b
    int temp;
    temp=*pa;                // pa 주소로 가서 값 참조 (temp=2;)
    *pa=*pb;                 // a의 주소값으로 b 주소값인 5 대입
    *pb=temp;                // 2를 b주소의 값으로 대입
    std::cout << *pa << " " << *pb << '\n' << std::endl;
}

ex2). 참조 연산자를 사용하는 방법

void swap(int &, int &);
int main()
{
    int a=2, b=5;
    std::cout << a << " " <<  b << '\n';
    // 밑의 swap 함수에서 a,b 바뀜 (잘 체크해야 call by value 인지 reference인지 알 수있음) 
    swap(a,b);
    std::cout << a << " " << b << '\n';
    return 0;
}

void swap(int &ra, int &rb)
{
    //int &ra=a, int &rb=b
    int temp;
    temp=ra;
    ra=rb;
    rb=temp;
    std::cout << ra << " " << rb << '\n';
}

#13-8. 참조자(reference, 레퍼런스) 예

int main(void)
{
    int num = 10; 
    int & variable = num;               // variable은 num의 참조자 (variable = num 동일!)
    std::cout << num << '\n';
    std::cout << variable << '\n';
    variable = variable + 10;
    std::cout << num << '\n';
    std::cout << variable << '\n';
    return 0;
}

#13-9. 포인터와 참조자(레퍼런스) 비교

  • &(연산자): x가 바뀌면 rx도 바뀐다.

#13-10. swap함수를 템플릿(genereic) 으로 구현

참조자에서 (call by reference) 에서

  • void swap(int &ra, int &rb)
    • swap 함수의 &ra, &rb가 바뀌면 메인함수의 a,b 도 바뀐다.

#13-11. 템플릿(generic) 클래스 만들기

  • 클래스의 instance 객체를 만들때는 자료형을 알려줘야함, 자료형 (결정되지 않은 자료형 모두)
template <class T1, class T2> 
class CCC 
{
    T1 x;
    T2 y;
public:
    CCC(T1 xx, T2 yy) { x = xx, y = yy;}
    void Print() {std::cout << x << ',' << y << std::endl;}
};

int main()
{
    CCC<int, int> c1(10,20);
    CCC<double,double> c2(3.5, 5.5);
    // = CCC<char, std::string> c3('I', "Love You!"); 와 동일함
    CCC<char, const char*> c3('I',"Love You!");
    CCC<int, char> c4(3,'B');

    c1.Print();
    c2.Print();
    c3.Print();
    c4.Print();
    return 0;
}

#13-12. STL(Standard Template Library)

    1. 컨테이너 (container): 담는 그릇
    • 배열 객체나 클래스 (vector, list, deque, string, map) 등
    1. 반복자 (iterator): 반복하는 거
    • 컨테이너에 저장된 요소를 순회하고 접근하는 객체나 클래스
    1. 알고리즘(algorithm)
    • 데이터를 다루기 위한 함수
    • find, sort, search 등
    1. 함수 객체 (function object), 함수자(functor)
    • 함수처럼 똑같이 동작하는 객체로 operator() 연산자를 중첩한 클래스의 객체

#13-13. friend 함수, friend 클래스

class A {
    int x;
public:
    void setX(int i) { x = i; }
    // 클래스 A 내부에 있지만 멤버함수가 아니고, 프랜드 함수를 지정하는 것임 (일반함수)
    friend int Double(A a);             //함수 Double는 클래스 A의 friend 함수
};
int Double(A a)                
{
    return(a.x*2);                    //특권: 클래스 A의 private 멤버 x를 접근할 수있음 
}
int main()
{
    A aa;
    aa.setX(3);
    std::cout << Double(aa);            //Double는 일반 함수, Double(aa)
    return 0;
}

#14-1. friend 클래스

profile
Hakuna Matata

0개의 댓글

관련 채용 정보