Programming/C++ STL2010. 9. 15. 13:06
int& a;
요 &가 바로 레퍼런스 변수이다.
어떻게 보면 포인터와 비슷하지만, 다른 녀석이고, C++ 공부중에 함수 인자에서 혼동을 느끼게 한 녀석이다.

// more than one returning value
#include <iostream>
using namespace std;

void prevnext (int x, int& prev, int& next)
{
  prev = x-1;
  next = x+1;
}

int main ()
{
  int x=100, y, z;
  prevnext (x, y, z);
  cout << "Previous=" << y << ", Next=" << z;
  return 0;
}

[링크 : http://www.cplusplus.com/doc/tutorial/functions2/]
[링크 : http://www.cplusplus.com/doc/tutorial/pointers/]

위의 소스중, prevent() 함수의 두/세번째 인자가 바로 reference 변수인데,
C에서는 당연히 포인터로 넘겨주어야 할꺼라고 생각을 했는데,
C++에서는 변수를 그냥 인자로 취해줌에도 불구하고 원본의 값이 바뀐다.
(당연히.. 레퍼런스 변수란걸 모르니 이상하게 보일수 밖에 ㅠ.ㅠ)

처음에는 자동형변환과 연관이 되어있나 했는데.. 그거랑은 거리가 좀 있는것 같고
그냥 단순히 C++ 문법적 특성으로 "참조형 변수" 라고 생각중 -_-

C++ 참조와 포인터의 차이점
- 만들어지면 값 변경불가
- 위의 이유로 null로 선언불가

C++ references differ from pointers in several essential ways:

  • It is not possible to refer directly to a reference object after it is defined; any occurrence of its name refers directly to the object it references.
  • Once a reference is created, it cannot be later made to reference another object; it cannot be reseated. This is often done with pointers.
  • References cannot be null, whereas pointers can; every reference refers to some object, although it may or may not be valid.
  • References cannot be uninitialized. Because it is impossible to reinitialize a reference, they must be initialized as soon as they are created. In particular, local and global variables must be initialized where they are defined, and references which are data members of class instances must be initialized in the initializer list of the class's constructor. For example:

[링크 : http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29]

[링크 : http://hijacker.egloos.com/1379523]
[링크 : http://www.cprogramming.com/tutorial/references.html]



'Programming > C++ STL' 카테고리의 다른 글

new / new[] / delete / delete[]  (4) 2010.09.16
cout 그리고 namespace  (0) 2010.09.16
C++ 레퍼런스 변수(reference variable)  (4) 2010.09.15
C++0x  (0) 2010.09.15
std::vector 포인터  (0) 2010.09.13
스마트 포인터(smart pointer)  (2) 2010.09.09
Posted by 구차니

댓글을 달아 주세요

  1. 요게 덩치큰 변수들을 함수 인자로 넘겨줄때 유용해요.
    구조체 같은거 넘겨 줄때 &로 받으면 포인터만 복사되기때문에 비용이 저렴하지요.

    struct foo { int a; double b; float c; }

    void boo( foo& value )
    { // Do Something }

    void main()
    {
    foo dummy;
    boo( dummy );
    }

    전 요런식으로 자주 써욤~
    주의 할건 인자가 변경되면 원본도 변경되니 변경을 원하지 않으면 const를 꼭 붙여야 한다는 것~

    2010.09.15 15:21 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 아무튼 C만 쓰다보니 C++ 문법이 정말 어색한게 많네요 ㅎ
      좋은 지도감사합니다 ㅋ

      음.. 근데 const 쓰면 에러가 나지 않나요 ㅎ

      2010.09.15 15:47 신고 [ ADDR : EDIT/ DEL ]
    • 값이 변경되는 것을 원치 않을 때 (단순 참조용 일 때) 붙이는거죠.
      void boo( const foo& value );
      요렇게요~ 'ㅂ'
      본문의 예제처럼 수정하는거면 그냥 const 없이~

      전 오히려 C++ 방식에 너무 길들여져서 C쪽이 더 낯설어여...

      2010.09.15 17:28 신고 [ ADDR : EDIT/ DEL ]
    • 요즘에는 차라리 처음부터 C++이나 JAVA 로 배웠으면 어땠을까 라는 생각을 하곤 한답니다 ㅋㅋ

      처음에 C로 시작을 하니, C스러운 사고를 하게되요 ㅠ.ㅠ

      2010.09.15 17:52 신고 [ ADDR : EDIT/ DEL ]