참조자: 별명, 즉 또다른 이름으로 반드시 정의 시 누구의 별명이 될 것인지 지정해야 한다.(한번 별명이 되면 절대로 다른 이의 별명이 될 수 없음)
&
기호를 이용해서 표기#include <iostream>
int main() {
int a = 3;
int& another_a = a;
}
int a = 1;
int& b = a;
int& c = b;
c = 2;
c
가 b
를 가리키기 위해 &&
같은 식으로 사용할 필요가 없음#include <iostream>
int main() {
int &ref = 4;
std::cout << ref << std::endl;
}
const int &ref = 4;
int a = ref;
c++에서 배열을 처리하는 방식을 생각해보면 배열의 이름은 첫 번째 원소의 주소값으로 변환이 될 수 있어야하기때문에
arr[1]
은*(arr+1)
로 변환가능하다. 이때 주소값이 존재한다는 의미는 해당 원소가 메모리 상에서 존재한다는 의미이기 때문에 레퍼런스는 특별한 경우가 아닌 이상 메모리 상에 존재하지 않으니 레퍼런스들의 배열을 정의하는 것은 모순이다.
int a, b;
int& arr[2] = {a,b};
#include <iostream>
int main() {
int arr[3] = {1, 2, 3};
int(&ref)[3] = arr; //ref[0]부터 ref[2]가 각각 arr[0]부터 arr[2]의 레퍼런스가 됨
ref[0] = 2;
ref[1] = 3;
ref[2] = 1;
std::cout << arr[0] << arr[1] << arr[2] << std::endl;
return 0;
}
int function() {
int a = 2;
return a;
}
int main() {
int b = function();
return 0;
}
function
안에 정의된 a
라는 변수의 값이 b
에 복사 됨function
이 종료되고 나면 a
는 메모리에서 사라짐int& function() {
int a = 2;
return a;
}
int main() {
int b = function();
b = 3;
return 0;
}
function
안에 정의된 a
의 참조자를 리턴하게 되는데 function
이 종료됨과 동시에 a
또한 사라지니 런타임 오류가 발생int& function(int& a){
a = 5;
return a;
}
int main()
{
int b = 2;
int c = function(b);
return 0;
}
function(b)
를 실행한 시점에서 a
는 main
의 b
를 참조해 아직 살아있는 b
를 계속 참조하게 됨 int c = function(b);
는 c
에 현재의 b
값인 5를 대입하는 것과 동일int function()
{
int a = 5;
return a;
}
int main()
{
int& c = function();
return 0;
}
위 코드를 컴파일 하게 되면 상수가 아닌 레퍼런스가 function 함수의 리턴값을 참조할 수 없다는
오류가 발생
예외
int function()
{
int a = 5;
return a;
}
int main()
{
const int& c = function();
std::cout<<"c : "<< c <<std::endl;
return 0;
}
함수에서 값 리턴(int f() ) | 함수에서 참조자 리턴(int& f() ) | |
---|---|---|
값 타입으로 받음int a = f() | 값 복사됨 | 값이 복사되지만 지역 변수의 레퍼런스를 리턴하지 않도록 주의 |
참조자 타입으로 받음int& a = f() | 컴파일 오류 | 가능하지만 지역 변수의 레퍼런스를 리턴하지 않도록 주의 |
상수 참조자 타입으로 받음const int& a = f() | 가능 | 가능 하지만 지역 변수의 레퍼런스를 리턴하지 않도록 주의 |
Q1. 레퍼런스가 메모리 상에 반드시 존재해야 하는 경우는 어떤 경우일까?
call by reference
를 하게 되면 참조자를 받을 때 주소를 전달하기 위해 메모리가 사용됨(함수에 넘겨주기 위해 메모리상에 존재하게 됨!)