study/C++

참조자(Reference)

IT공부 2020. 5. 19. 20:42
반응형

참조자(Referenfce) 이해 

 

"변수는 할당된 메모리 공간에 붙여진 이름이다. 그리고 그 이름을 통해서 해당 메모리 공간에 접근이 가능하다"

 

"참조자는 할당된 하나의 메모리 공간에 또 다른 이름을 붙이는 것이다."

 

int &num2=num1; 

 

위의 문장을 실행하면, num1이라는 이름이 붙어있는 메모리 공간에는 num2라는 이름이 하나 더 붙게 된다. 

 

int *ptr=&num1;  //변수 num1의 주소 값을 반환해서 포인터 ptr에 저장

int &num2=num1 //변수 num1에 대한 참조자 num2를 선언

 

Reference.cpp

#include<iostream>
using namespace std;

int main(void)
{
	int num1=1020;
	int &num2=num1;
	
	num2=3047;
	cout<<"VAL: "<<num1<<endl;
	cout<<"REF: "<<num2<<endl;
	
	cout<"VAL: "<<&num1<<endl;
	cout<"REFL "<<&num2<<endl;
	return 0;
}

실행결과 

VAL: 3047

REF: 3047

VAL: 0012FF60

REF: 0012 FF60

 

"변수에 별명(별칭)을 하나를 붙여주는 것입니다."

 

"참조자의 수에는 제한이 없으며, 참조자를 대상으로도 참조자를 선언할 수 있다."

 

int num1= 2759;

int &num2=num1;

int &num3=num1;

int &num4=num1;

 

int num1= 2759;

int &num2=num1;

int &num3=num2;

int &num4=num3;

 

"참조자의 선언 가능 범위"

 

int &ref=20;  (x) //참조자는 변수에 대한 별칭을 붙이는 것이므로 상수를 대상으로 참조자를 선언할 수 없다

 

int &ref;     (x) //선언과 동시에 누군가를 참조해야 한다.

 

int &ref=NULL; //NULL로 초기화하는 것도 불가능

 

"배열과 포인터"

#include<iostream>
using namespace std;

int main(void)
{
	int arr[3]={1,3,5};
	int &ref1=arr[0];
	int &ref2=arr[1];
	int &ref3=arr[2];
	
	cout<<ref1<<endl;
	cout<<ref2<<endl;
	cout<<ref3<<endl;
	
	int num=12;
	int *ptr=&num;
	int **dptr=&ptr;
	
	int &ref=num;
	int *(&pref) = ptr;
	int **(&dpref)=dptr;
	
	cout<<ref<<endl;
	cout<<*pref<<endl;
	cout<<**dpref<<endl;
	return 0;
}

실행결과 

1

3

5

12

12

12

 

"참조자(Reference)와 함수"

 

"참조자를 이용한 Call-by-Reference"

#include<iostream>
using namespace std;

void Swapbyref(int &ref1, int &ref2)
{
	int tenp=ref1;
    ref1=ref2;
    ref2=temp;
}//call-by-reference

int main(void)
{
	
    int val1=10;
    int val2=20;
    Swapbyref(val1, val2);
    cout<<"val1: "<<val1<<endl;
    cout<<"val2: "<<val2<<endl;
    return0
    }

실행결과 

val1: 20

val2: 10

 

"함수 내에서, 참조자를 통한 값의 변경을 진행하지 않을 경우, 참조자를 const로 선언해서,  함수의 원형만 봐도 

 값의 변경이 없는 것을 알 수 있다. 

 

아래와 같이 함수에서 값의 변경이 필요 없다면 const 참조자를 이용한다. 

void HappyFunc(const int &ref) {....... }

 

 

"반환형이 참조형(Reference Type)인 경우 

 

함수의 반환형에도 참조형이 선언될 수 있다. 

 

int& RefFunc(int &ref)

{

   ref++;

   return ref;

}

#include<iostream>
using namespace std;

int& RefRetFuncOne(int &ref)
{
	ref++;
	return ref;
}

int main(void)
{
	int num1=1;
	int &num2=RefRetFuncOne(num1);
	
	num1++;
	num2++;
	cout<<"num1: "<<num1<<endl;
	cout<<"num2: "<<num1<<endl;
	return 0;
}

실행결과 

num : 4

num : 4

 

"RefRetFuncOne 함수 반환 후 ref 참조자는 소멸된다.

 

int num1=1;

int &ref=num1;       // 인자의 전달 과정에서 일어난 일

int &num2=ref;       // 함수의 반환과 반환 값의 저장에서 일어난 일

 

 

 

 

 

 

 

출처: 윤성우 열혈 C++ 프로그래밍

저작권상 문제가 있다면 게시글을 내리겠습니다. 

 

 

'study > C++' 카테고리의 다른 글

예외처리 (try catch)  (0) 2020.06.30
malloc & free를 대체하는 new & delete  (0) 2020.05.20
자료형 bool  (0) 2020.05.19
이름공간(namespace)에 대한 소개  (0) 2020.05.19
매개변수의 디폴트 값(Default Value)  (0) 2020.05.19