레퍼런스 재할당 관련 궁금한 점이 있습니다.
90
작성한 질문수 1
int val1 = 123;
int val2 = 456;
int& reref = val1;
cout << reref << endl;
reref = 888;
cout << val1 << endl;
cout << reref << endl;
reref = val2; //여기서 재할당 하였습니다.
cout << reref << endl;
cout << val2 << endl;
--여기까진 제가 생각한 대로 출력이 되었습니다.--
reref = 1004; //재할당한 레퍼런스 변수 값을 변경하였습니다.
cout << reref << endl;
cout << val2 << endl;
cout << val1 << endl;
저는 여기서 reref와 val2가 1004가 출력이 되고 val1은 888이 나올 줄 알았지만, reref와 val1이 1004가 출력되고 val2는 456으로 값이 변경되지 않았습니다.
cout << &reref << " " << &val2 <<" " << &val1 << endl;
혹시나 해서 세 변수의 주소를 출력해보았는데 reref에 val2를 재할당했음에도 불구하고 reref와 val1의 주소가 일치하게 출력되었습니다.
재할당한 레퍼런스의 변수는 값을 변경하면 안되는 건가요??
레퍼런스변수가 재할당한 val2가 아닌,
선언 시의 val1의 주소와 값이 같은 이유가 궁금합니다!
환경은 visual studio 2022입니다!
답변 1
2
안녕하세요? 질문&답변 도우미 Soobak 입니다.
참조 변수는 반드시 선언과 동시에 초기화되어야 하며, 이후에는 참조하는 대상을 변경할 수 없습니다.
참조는 마치 별명(alias)처럼 동작하기 때문입니다.
즉, int& reref = val1; 으로 선언과 초기화를 하신 참조 변수 reref 는 val1 을 참조하는 별명처럼 동작하며, 이후 val1 과 같은 주소를 가지는 변수로 고정이 됩니다.
따라서, 중간에 reref = val2; 와 같이 작성하신 부분은 val2 변수의 '값' 을 val1 에 '대입'을 하는 것이며, '재할당' 을 하는 것이 아닙니다.
reref = val2; // val2 의 값을 val1 에 대입, (재할당이 아님)
cout << reref << endl; // 출력: 456 (val1 의 값이 456으로 변경된 것)
cout << val2 << endl;
이후의 reref = 1004; 코드 부분 또한 val1 을 참조하고 있는 reref 의 값을 1004 로 변경합니다.
따라서, val1 의 값이 1004 로 바뀌고, val2 는 영향을 받지 않는 것입니다.
1
아하 재할당은 불가하고 그냥 val1(== reref)에 val2 값을 대입한 것이 되는군요.
답변 감사합니다.
혹시, 강의 챕터 '6.14 참조 변수' 타임라인 6:26 부분에 재할당이 가능한가에 대해선 재할당은 불가하고 ref1에 value2값을 대입한 걸로 보면 될까요?
1
안녕하세요? 질문&답변 도우미 Soobak 입니다.
네, 맞습니다. 옳게 이해하고 계십니다.
참조 대상 자체를 변경하는 것이 아니라, 참조 대상에 값을 다시 할당한다는 의미로 이해하시는 것이 옳습니다. 👍
교재 있나요?
1
132
2
11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)
1
87
3
using namespace std; 선언 후에 std::를 하는 이유가 궁금합니다
1
99
2
cstr직접구현
0
115
3
BubbleSort
1
77
2
숙제 마지막 부분
1
78
2
강의와 똑같이 진행했는데 링킹 에러가 발생합니다.
1
92
2
수업할때 레퍼런스로 사용하는 도서는 어떤 도서인가요??
1
160
2
공변반환형 관련 문의 드립니다.
1
89
2
170강 유니크 포인터에대해 질문있습니다
1
80
1
섹션 5 퀴즈의 답이 이상합니다
1
83
2
이중포인터와 배열이 이해가 안됩니다.
1
152
2
5분 17~5분 34초 객체 잘림 질문
1
77
1
Resource.h 코드 알려주세요
1
71
1
char name[] 배열의 길이와 관련해 일부 궁금점이 생겨서 질문합니다
1
93
2
화면좌측 숫자 보이기
1
114
1
화면 좌측 숫자 보이기
0
65
1
처음 c++ 수강하려는데요. 비주얼스튜디오 2022 다운로드해서 설치하면 되는건가요??
1
137
3
46강 string 버퍼 질문입니다
1
80
2
프로그래머스 수열과 구간 쿼리 2 문제 질문입니다.
1
123
2
[] 범위 검사시 assert 사용 관련 질문
1
87
2
Lecture 클래스 멤버변수 명명 관련
0
89
2
프로그래머스의 대소문자 바꿔서 출력하기 문제를 푸는데요
0
73
1
noexcept과 throw()
1
81
2





