728x90
반응형
레퍼런스 변수
레퍼런스변수도 포인터랑 비슷한 개념이다. 다만 레퍼런스 변수는 대입된 변수의 값과 주소값을 모두 그대로 가진다.
얘도 어떤 변수를 가리키고, call-by reference가 가능했다.
그렇다면 포인터랑 다른점은 무엇일까?
포인터의 경우 a가 10으로 바뀐다
레퍼런스 변수의 경우 p=10만 해주면 a가 10으로 변한다.
레퍼런스의 대표적인 예시가 swap이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <iostream>
#include<string>
using namespace std;
void swap(int& a ,int &b) {
int tmp = a;
a = b;
b = tmp;
}
int main() {
int a(5), b(7);
swap(a, b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
}
|
cs |
연습문제
레퍼런스 변수를 사용해 윗줄은 1 2 3 4 5 6 7 8 9 10 아랫줄은 2 3 4 5 6 7 8 9 10 11이 출력되게 만들어보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream>
#include<string>
using namespace std;
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (int n : arr) {
cout << n << ' ';
}
cout << endl;
for (int n : arr) {
cout << n << ' ';
}
cout << endl;
}
|
cs |
예를 들어 int n=arr[2]일 때를 생각해보자. n은 개별적인 변수이기 때문에 n을 바꾼다고 해서 arr의 값이 당연히 바뀌지 않는다.
n++을 cout보다 위에 쓴다고 하면 오히려 윗줄에 2 3 4 5 ..11 아랫줄에 1 2 3 ..10 이 나올거다.
그렇기에 n값이 arr의 원소를 가리키게 해야한다.
이때 사용할 수 있는게 레퍼런스 변수다.
의도한바대로 잘 출력된다.
n이 arr의 원소들을 가리키기 때문에 n++을 했을 때도 arr의 원소들이 1씩 증가하는 것이다!
cf) 포인터를 가리키는 레퍼런스 변수 -> 포인터로 생각
레퍼런스 변수는 한번 가리키고 있는 값이 더는 바뀌지 않음
수정할 수 없는 값 = r-value
수정할 수 있는 값 = l-value
int a=5; 일때 변수 a는 수정할 수 있는 값이기에 l-value이고 숫자 5는 수정할 수 없는 값이기에 r-value이다.
728x90
반응형
'C++ > 기초(두들낙서)' 카테고리의 다른 글
[C++기초] this 포인터 ,객체의 생성과 소멸,생성자와 소멸자 (0) | 2022.01.12 |
---|---|
[C++기초] 클래스 개념소개,접근제어 지시자,구조체와 클래스의 차이점 (0) | 2022.01.12 |
[C++기초] 네임스페이스 (0) | 2022.01.12 |
[C++기초]이차원 배열을 범위기반 for문으로 구현하기 (0) | 2022.01.12 |
[C++기초] 오버로딩,디폴트 매개변수 (0) | 2022.01.12 |
댓글