[C++] 참조자와 함수

서희찬·2021년 5월 3일
0
post-thumbnail

C++에서는
Call-by-reference의 구현 방법에
참조자를 매개변수로 전달하는 방법과 주소 값을 이용하는 방법 이렇게 두가지가 있다.

참조자는 선언과 동시에 변수로 초기화 되어야하는데...
매개변수는 함수가 호출되어야 초기화가 진행되는 변수들이다.
이 말은 함수호출 시 전달되는 인자로 초기화를 하겠다는 의미이다 !!

문제 1

참조자를 이용하여 인자로 전달된 int 형 변수 값 1씩 증가시키는 함수와 부호를 바꾸는 함수와 main을 만들고 출력해봐라

#include <iostream>

using namespace std;

void pp(int &ref1)
{
    ref1+=1;
}

void re(int &ref2)
{
    ref2*=-1;
}

int main(void)
{
    int num = 1;
    pp(num);
    
    cout<<num<<endl;
    re(num);
    cout<<num<<endl;
    
    return 0;
}


성공 !

문제 2

위의 코드에서 re(2)를 re(num)대신 사용하면 에러가 뜬다.
왜 그럴까?
-> 참조자는 상수를 참조할 수 없다!!!
그러므로 매개변수의 인자로 반드시 변수가 등장해야한다.

문제 3

#include <iostream>

using namespace std;



int main(void)
{
    int num1 = 5;
    int *ptr1 = &num1;
    int num2 = 10;
    int *ptr2 = &num2;
    SwapPointer(ptr1,ptr2);
    
    cout<<*ptr1<<endl;
    cout<<*ptr2<<endl;
    
    return 0;
}

여기에 SwapPointer 함수를 짜주자 !

#include <iostream>

using namespace std;

void SwapPointer(int *(&ref1), int *(&ref2))
{
    int *temp = ref1;
    ref1 = ref2;
    ref2 = temp;
    
}

int main(void)
{
    int num1 = 5;
    int *ptr1 = &num1;
    int num2 = 10;
    int *ptr2 = &num2;
    SwapPointer(ptr1,ptr2);
    
    cout<<*ptr1<<endl;
    cout<<*ptr2<<endl;
    
    return 0;
}

참조자를 이용한 call-by-reference의 황당함과 const참조자

c 와 다르게 c++ 에서는 참조자를 통해서 함수내에서 값 변경이 가능하므로 const선언을 추가해서 헷갈림을 방지할 수 있다 !

위의 단점때문에 참조자를 많이 사용안하고 포인터를 사용하는 프로그래머들도 많다.

다음 포스트에서 이어가겠다.

profile
Carnegie Mellon University Robotics Institute | Research Associate | Developing For Our Lives, 세상에 기여하는 삶을 살고자 개발하고 있습니다

0개의 댓글