C++/summary

레퍼런스

gandus 2010. 5. 4. 15:36
포인터
type * p;

레퍼런스
 type &r   =  기억공간이름(변수명)           // 기억공간을 공유
                                                          // 반드시 선언과 동시에 초기화!!!!

사용시 주의점

선언과 동시에 초기화

int n=20, m=20;
int &ref = n;

ref = m            // 변경이 불가능하다, 상수화 된다.

int &ref;           // 초기화가 되지 않았다.

상수로 초기화하면 컴파일오류


int &ref = 10;    // 기억공간(변수명)



레퍼런스의 장점



이전에는 포인터를 이용하여 스왑을 하였지만....


void swap(int &rx, int &ry);

int main()

{

  int a = 100, b = 200;

  cout << "swap() 호출전: a = " << a << ", b = " << b << endl;

  swap(a, b);

  cout << "swap() 호출후: a = " << a << ", b = " << b << endl;

  return 0;

}


void swap(
int &rx, int &ry)          // 스왑사용시 포인터를 이용하지않고

{                                                   // 레퍼런스를 사용하여 바꾸어준다

  int tmp;

  cout << "In swap() : rx = " << rx << ", ry = " << ry << endl;

  tmp = rx; rx = ry; ry = tmp;

  cout << "In swap() : rx = " << rx << ", ry = " << ry << endl;

}




함수 인자 전달방식
1. pass by value:   실인자 - > 형식인자로 복사됨

2. pass by address   실인자(주소) 전달  ->  형식인자는 포인터변수

3. pass by reference    실인자(변수명만)  - >  형식인자는 레퍼런스 변수
                                 실인자와 형식인자는 기억공간을 공유한다.

->  많은 리턴값을 받아오는데 2,3번이 유용하다.




레퍼런스를 반환값으로 가능한가??


int a= 10;
int & f() {         // f() 는 a의 레퍼런스이다.
   a= 20;           // f() 는 a의 값을 참조한다.
   return a;

}

void main(){
    f() = 30;        //  f() = 30    - > 이것은    a = 30 과 같은 말이다.
    cout<<a;
}

하지만

// int a= 10;
int & f() {         
   int a= 20;         // 지역변수라서 불가능하다.
   return a;

}
이것은 지역변수를 사용하기 때문에 불가능하다.