728x90
728x170
* 인수와 레퍼런스
- 포인터를 함수의 인수로 사용하면 호출자의 변수를 변경할 수 있음.
- 하지만 포인터는 메모리 주소를 직접 다루기 때문에 어려움.
- 레퍼런스(reference) : 변수등으로 초기화한 식별자. 형명 앞에 &를 붙여서 선언함.
형명& 레퍼런스명 = 변수; // 레퍼런스명에는 식별자를 사용함. |
int a; int& rA = a; // 레퍼런스 rA를 변수 a로 초기화함. |
-> 이 코드에서 'rA'가 레퍼런스. rA를 변수 a로 초기화한 것.
- 예)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
#include <iostream>
using namespace std;
int main() {
int a = 5;
int& rA = a; // 레퍼런스 rA를 변수 a로 초기화함.
cout << "변수 a의 값은 " << a << "입니다. \n";
cout << "레퍼런스 rA의 값은 " << rA << "입니다. \n";
rA = 50;
cout << "rA에 50을 대입했습니다. \n";
cout << "레퍼런스 rA의 값은 " << rA << "(으)로 변경되었습니다. \n";
cout << "변수 a의 값도 " << a << "(으)로 변경되었습니다. \n";
cout << "변수 a의 주소는 " << &a << "입니다. \n";
cout << "레퍼런스 rA의 주소도 " << &rA << "입니다. \n";
return 0;
} |
cs |
-> 레퍼런스 rA의 값과 주소는 변수 a와 완전히 같음.
-> 레퍼런스 rA를 변수 a로 초기화함으로써 rA는 a와 완전히 같아진 것.
- 레퍼런스 rA를 사용하여, 이것을 초기화시킨 변수 a를 다룰 수 있음.
- 레퍼런스는 반드시 레퍼런스 대상이 되는 변수로 초기화해 두어야 함.
- 레퍼런스의 선언과 대입을 분리할 수 없음.
int& rA; rA = a; // 레퍼런스에 대입할 수 없음. |
- 레퍼런스는 포인터와 유사한 기능을 가지고 있음.
- 그러나 레퍼런스는 포인터와 엄연히 다른 개념이므로 포인터에 레퍼런스를 대입할 수는 없음.
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 |
#include <iostream>
using namespace std;
// swap 함수 선언
void swap(int& x, int& y); // void swap(int* px, int* py);
int main() {
int num1 = 5;
int num2 = 10;
cout << "변수 num1의 값은 " << num1 << "입니다. \n";
cout << "변수 num2의 값은 " << num2 << "입니다. \n";
cout << "변수 num1과 num2의 값을 교환합니다. \n";
swap(num1, num2); // swap(&num1, &num2);
cout << "변수 num1의 값은 " << num1 << "입니다. \n";
cout << "변수 num2의 값은 " << num2 << "입니다. \n";
return 0;
}
// swap 함수의 정의
void swap(int& x, int& y) {
int tmp;
tmp = x;
x = y;
y = tmp;
}
/*
void swap(int* px, int* py) {
int tmp;
tmp = *px;
*px = *py;
*py = tmp;
}
*/
/*
* [출력 결과]
* 변수 num1의 값은 5입니다.
* 변수 num2의 값은 10입니다.
* 변수 num1과 num2의 값을 교환합니다.
* 변수 num1의 값은 10입니다.
* 변수 num2의 값은 5입니다.
*/ |
cs |
- const 지정자가 붙은 인수는 함수 안에서 그 값을 변경시킬 수 없음.
void func1(const int* px); void func2(const int& x); // const를 붙이면 함수 안에서 실인수를 변경시킬 수 없음. |
728x90
그리드형(광고전용)
'Programming > C++' 카테고리의 다른 글
[STL] getline (0) | 2017.10.20 |
---|---|
[STL] ceil, floor, round (0) | 2017.09.23 |
[STL] sort (0) | 2017.09.22 |
C++ Character Literals (0) | 2017.09.02 |
함수 템플릿 (Function Template) (0) | 2017.05.29 |
함수 오버로드 (Function Overloading) (0) | 2017.05.25 |
기본 인수 (Default Argument) (0) | 2017.05.25 |
인라인 함수 (Inline Function) (0) | 2017.05.25 |