해당 내용은 씹어먹는 C++ 책을 기반으로 하단 블로그의 내용을 공부하기위해 적성한 글임을 알립니다.
int x = 10;
int& r = x;
r과 x는 완전히 동일한 객체
r을 바꾸면 x가 바뀜
선언과 동시에 반드시 초기화 필요
한 번 바인딩되면 다른 변수로 변경 불가
포인터: 주소를 저장 (int* p)
래퍼런스: 변수의 별명 (int& r)
래퍼런스 = “복사가 아닌 원본 자체를 직접 다루는 별명”
#include <iostream>
int change_val(int *p) {
*p = 3;
return 0;
}
int main() {
int number = 5;
std::cout << number << std::endl;
change_val(&number);
std::cout << number << std::endl;
}
change_val 함수의 인자 p 에 number 의 주소값을 전달하여, *p 를 통해 number 를 참조하여 number 의 값을 3 으로 바꿈
int& another_a = a;
그 후에 우리는 a 의 참조자 another_a 를 정의하였습니다. 이 때 참조자를 정하는 방법은, 가리키고자 하는 타입 뒤에 & 를 붙이면 됨
int a = 10;
int* p = &a; // p 는 a 를 가리킨다.
int b = 3;
p = &b // 이제 p 는 a 를 버리고 b 를 가리킨다
#include <iostream>
int main() {
int &ref = 4;
std::cout << ref << std::endl;
}
int a, b;
int& arr[2] = {a, b};
int& function() {
int a = 2;
return a;
}
int main() {
int b = function();
b = 3;
return 0;
}
-> [1] 7170 segmentation fault (core dumped) ./test 이런 오류가 나옴
int& ref = a;
// 근데 a 가 사라짐
int b = ref; // !!!
int& function(int& a) {
a = 5;
return a;
}
int main() {
int b = 2;
int c = function(b);
return 0;
}
#include <iostream>
int function() {
int a = 5;
return a;
}
int main() {
const int& c = function();
std::cout << "c : " << c << std::endl;
return 0;
}
이런 경우 const로 예외 상수로 받아 상수 레퍼런스로 리턴값을 받게 되면 해당 리턴값의 생명이 연장됨
| 함수 반환 | 받는 방식 | 가능 여부 | 동작 설명 | 주의사항 |
|---|---|---|---|---|
int f() (값 반환) | int a = f() | 가능 | 값 복사됨 | 없음 |
int f() (값 반환) | int& a = f() | 컴파일 오류 | rvalue를 non-const 참조로 받을 수 없음 | - |
int f() (값 반환) | const int& a = f() | 가능 | 임시 객체를 const 참조로 바인딩 | lifetime 연장 |
int& f() (참조 반환) | int a = f() | 가능 | 값 복사됨 | 참조 의미 사라짐 |
int& f() (참조 반환) | int& a = f() | 가능 | 원본 변수 참조 | 지역 변수 반환 금지 |
int& f() (참조 반환) | const int& a = f() | 가능 | const 참조로 바인딩 | 지역 변수 반환 금지 |