참조자(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=#
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 |