ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 레퍼런스(&) , call-by-reference
    플밍/C++ (overview) 2012. 1. 3. 22:46
    2006/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
Designed by Tistory.