<2> 레퍼런스 (reference)
- C언어에서는 다른 함수에있는 변수에 접근하기 위해 포인터를 사용했다.
- C++ 에서는 레퍼런스 라는 것을 통해 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <cstdio> typedef struct arr100 { int arr[100]; } Arr100; void c_Swap(int *a, int *b) { int t = *a; *a = *b; *b = t; } void ref_Swap(int &a, int &b) { int t = a; a = b; b = t; } int sum(Arr100 &t) // Decreasing memory overhead. { int Sum=0; for(int i=0; i<100; i++) Sum += t.arr[i]; return Sum; } int main() { int x = 3; int y = 5; // int &ref; => impossible // &ref = x; => impossible int &ref = x; printf("%d %d\n", x, ref); // 3 3 printf("%p %p\n", &x, &ref); // 0x7ffee122ca68 0x7ffee122ca68 c_Swap(&x, &y); printf("%d %d\n", x, y); // 5 3 ref_Swap(x, y); printf("%d %d\n", x, y); // 3 5 Arr100 A; for(int i=0; i<100; i++) A.arr[i] = 100-i; int Sum = sum(A); printf("%d\n", Sum); // 5050 return 0; } | cs |
>> 34 : 선언과 동시에 초기화가 필요하다.
>> 35 : 한번 가리킨 대상을 바꿀 수 없다.
>> 36 : 레퍼런스의 선언. 변수이름 앞에 &를 붙인다.
자료형 &변수명 = 참조할 변수명; 의 형태를 가진다.
>> 37 : x와 x를 reference 로 하는 ref 는 같은 값을 갖는다.
>> 38 : 역시 같은 주소를 갖는다. 즉 어떤 변수에 새로운 이름을 부여한다고 생각하면 된ㄷ
>> 40 : c 언어에서의 swap 함수이다. 포인터를 사용
>> 43 : 레퍼런스를 이용한 swap 으로, 매개변수를 전달할 때 주소를 전달하지 않으며,
14 라인에서 보듯이 매개변수를 참조형으로 선언해서 전달받는다.
>> 51, 21 : 이렇게 참조형으로 매개변수를 전달 받으면, 메모리 오버헤드를 줄일 수 있다.
매개변수도 일종의 지역변수 이므로 그만큼의 메모리를 차지하지만, 참조형으로 전달
받으면 그렇지 않다. 재귀함수에서 변하지 않는 객체를 넘길 경우에서 유용하다.
- 그 외 상수값으로 초기화 할 수 없다. 바인딩을 할 수 없다는 컴파일 에러 발생
1 | int &refConstant = 10; | cs |
error: non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'
int &refConstant = 10;
- 그 외 레퍼런스로 이루어진 배열을 만들 수 없다고 한다.
- 기본적인 내용은 이정도 이며, 나중에 참조형이 참 재미있는(?) 기능임을 알게 될 것이다.
(함수의 리턴형이 참조형인 경우)
- 또한, 래퍼런스의 필요성은 [] 등 오퍼레이터 오버로딩에서 나타난다고 한다.
*vec[10] = 3; 같은 이상한 표현을 쓰지 않아도 된다고 하는데,
이 글을 작성하고 있는 시점에서 아직 은 모르는 내용이다.....
- '레퍼런스로 이루어진 배열'(int &arr[10])은 만들 수 없지만, '배열의 레퍼런스'(int (&arr)[10])은
만들 수 있다고 한다.. 함수의 인자로 넘겨서 항상 특정 길이를 가진 배열만을 받게 할 수도 있지만,
그러느니 그냥 std::array나 std::vector 쓰는 게 낫다고 함.
출처 : http://kks227.blog.me/60204949464
'Language > C++' 카테고리의 다른 글
<3> namespace (네임스페이스) (0) | 2018.02.22 |
---|---|
<1> C++ 에서 확장된 기능 (0) | 2018.02.12 |