-
레퍼런스(&) , call-by-reference플밍/C++ (overview) 2012. 1. 3. 22:462006/07/26 02:33
int val;
val의 별명을 ref 라고 붙여주자.
방법 : int &ref = val;
val의 이름이 두개 생겼다.
val 그리고 ref.
int &ref; //ERROR
int &ref = 10; //ERROR
변수란? 메모리 공간에 할당된 이름을 의미한다.
C에선 한 메모리 공간에 1개만의 이름을 할당할수 있었지만,
C++에선 한 메모리 공간에 2개 이상의 이름을 할당 할수 있다.
================================================
어짜피 같은건데, 어디에 쓸까?
함수 호출에서, call-by-value와 call-by-reference방식이 있다.
전자는, 말 그대로 값을 그대로 복사해서 넘겨주는 방식이다.
그렇다면, call-by-reference의 경우를 살펴보자.
function(자료의 주소값)
이렇게 자료의 주소값을 직접 넘기는 방식인데, 그 방법에는 우선 포인터가 있다.
void function(int* top)
그런데, 혹시 실수로 top에 저장된 주소값을 변경시켜버릴지도 모른다. (인간이니까-_-)
top++
처럼 말이다. 포인터를 이용한 방법은 포인터연산이 가능하기때문에 잘못된 메모리접근을
할 가능성이 높다. 이런 단점을 버린 방식이 레퍼런스를 이용하는 것이다.
void function(int& input)
main(){
int top=10;
//0x00X라는 집에 10을 넣고, 그 집 명패를 top이라고 달아두었다.
function(top);
//function body내에 정의된 지역함수에 int& input = top 이런식으로
인자가 전달된다. 즉, top이라는 명패 옆에, input이라는 명패도 붙은것이다.
한 집에 명패가 둘이나 달렸다. 그 집은 top이라 불려도 좋고, input이라
불려도 좋다.
}
그런데, function body의 parameter들은 함수 호출이 끝나면 자동 소멸되지 않는가?
걱정 할것 없다. int& input은 사라지더라도 그 이름만 사라지는 것이지, 그 이름이
붙어있던 메모리공간까지 사라지는것은 아니다. (명패만 떼어버리는것이다.)
* 더 생각해보기 *
[레퍼런스를 리턴하는 함수]
예 : int& fun(int& top)
한가지 주의할점! 지역변수는 레퍼런스로 리턴할수 없다.
int& fun(int& xxx){
int p= 10;
return p; (X)
}
'플밍 > C++ (overview)' 카테고리의 다른 글
구조체에서 클래스로! (0) 2012.01.03 동적 메모리 할당(malloc, new) (0) 2012.01.03 const, * .. (0) 2012.01.03 namespace, (범위지정연산자) (0) 2012.01.03 매크로, inline (0) 2012.01.03