본문으로 바로가기

[C++]참조자(reference) 3

category 프로그래밍/C++ 2017. 4. 11. 00:52
728x90
반응형
안녕하세요. letitkang입니다.

오늘도 포스팅 시작해보겠습니다!


오늘 참조자를 마무리하겠습니다.


'윤성우의  C++ 열혈강의'를 보고 공부합니다!


 

 

 



1. 반환형이 참조자인 경우


참조자는 반환형으로 사용할 수 있습니다.


===============================================================================================


int& RefRetFunc(int &ref)

{

ref++;

return ref;

}


===============================================================================================


위의 함수에서는 반환형과 매개 변수가 참조자로 선언되어 있습니다.


함수 그대로 참조자를 반환하고 있습니다.


위의 경우에는 리턴값을 참조자로 받을수도 있고, 일반 변수로 받을 수도 있습니다.


일반 변수로 받게되면, ref의 값이 일반변수로 리턴되고, 참조자 변수로 리턴을 받으면, 리턴 값을 참조하게됩니다.


정리하자면 밑의 값을 보면 됩니다.


===============================================================================================


int num = 1;

int &ref = num1;

int &num2 = ref;


===============================================================================================


int num1 = 1;

int &ref = num1;

int num2 = ref;


===============================================================================================


위에서 설명한 것이 바로 위의 소스를 의미합니다.


2. 잘못된 참조


아래의 함수를 살펴보겠습니다.


===============================================================================================


int& RetuRefFunc(int n)

{

int num = 20;

num+=n;

return num;

}


int &ref = RetuRefFunc(10);


===============================================================================================


위의 함수에서 지역변수 num에 저장된 값을 반환하지 않고, num을 참조 형태로 반환하고 있습니다.


이렇게 되면,  지역변수 num에 ref라는 또 하나의 이름이 붙게 됩니다.


그러나 여기서 중요한 것은 함수를 벗어나면 지역변수를 소멸됩니다.


컴파일러가 경고는 해주지만, 컴파일은 정상적으로 진행됩니다.


ref의 값에 지역변수의 값이 남아있을 수 있거나. 이상한 값이 들어가 있을 수도 있으니, 꼭 확인 하시기 바랍니다.


 

 

 



3. const 참조자의 또 다른점


const참조자의 또 다른 점이 있습니다.


먼저 아래의 코드를 봅시다.


===============================================================================================


const int num = 20;

int &ref = num;

ref+=10;

cout<<num<<endl;


===============================================================================================


위의 소스는 변수 num을 상수화 하고, 참조자 ref을 통해서 값을 변경하였습니다.


그러나 여기서는 num의 상수화는 의미가 없습니다.


컴파일러에서는 여기서 에러를 일으킵니다.


===============================================================================================

int &ref = num;

===============================================================================================


그러므로 걱정없습니다.


그러면 변수 num의 상수화된 변수를 참조자로 선언하려면 아래와 같이 해야됩니다.


===============================================================================================

const int num = 10;

const int &ref = num;

===============================================================================================


이렇게하면 문제 없습니다.


그리고 const 참조자는 상수도 참조가 가능합니다.


===============================================================================================

const int &ref = 10;

===============================================================================================


성립되는 이유는 10은 리터럴 상수입니다. 10도 메모리 공간을 가지고 있기 때문에, const를 이용해서 참조자를 선언하면 상수 30을 저장하고 참조합니다.


즉, 임시적으로 변수를 만들어서 참조하는 구조입니다.


의문이 드시나요? 마지막 소스를 보고, 의문을 푸시기 바랍니다.


===============================================================================================


int Adder(const int &num1, const int &num2)

{

retrurn num1+num2;

}


===============================================================================================


 

 



위의 함수를 보면, 인자의 전달을 하기 위해서 변수를 선언하는건 복잡합니다.


그러나 const를 사용하여서 임시변수를 생성하여 값을 넣기 때문에 호출도 간단합니다.


cout<Adder(10, 20)<< endl;


여기까지가 참조자에 대한 모든 설명입니다.


복잡하지만, 유용하게 쓰입니다.


다음 포스팅부터는 진도를 빨리 빨리 넘어가야겟네요!


읽어주셔서 감사합니다.

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++]C++의 구조체와 Class  (0) 2017.04.20
[C++]new 와 delete, 그리고 C++의 헤더파일  (0) 2017.04.17
[C++]참조자(reference) 2  (0) 2017.04.09
[C++]참조자(reference) 1  (0) 2017.04.04
[C++]자료형 bool  (0) 2017.03.30