int x;
int* p{&x};
*p = 3;
int x;
______________________________________
cpp에서의 참조형
>한번 참조된 후 다른 곳으로 갈 수 없음
>선언과 동시에 반드시 선언 대상을 초기화해야함
int x;
int& 변수명{x};
x =3;
참조형은 매개변수에 사용하기 좋다
______________________________________
const int& 변수명;
l-value는 이름이 있어야함 (변수)
r-value는 주소가 없다 (리터럴)
void Print(int& x) //참조형
{
std::cout << x;
x = 10;
}
int main()
{
int x{1};
//x : l-value(이름을 가진 객체) vs ex)10: r-value(이름이 없는 리터럴같은것)
Print(x);
Print(10); //불가능 : r-value
std::cout << x;
}
우측값 참조(rvalue referecne)
상수를 가리키는 참조형을 써보자
void Print(const int& x) //상수의 참조형
{
std::cout << x;
}
int main()
{
int x{1};
Print(x);
Print(10); //위와 다르게 가능함
std::cout << x;
}
10은 메모리에 존재하지만 이름을 가지지 않음
그래서 그 라인에서 벗어나면 찾아오지 못함
하지만 그 라인에서는 쭉 사용가능 그 말은
함수로 들어가게 되더라도 매개변수로 복사되어 들어갈 수 있다 (rvalue를 참조하게 되는 것이다)
________________________________________________________
이 개념을 확장해서 이 경우도 가능하다
int main()
{
int x{1};
//x : l-value(이름을 가진 객체) vs ex)10: r-value(이름이 없는 리터럴같은것)
Print(x);
Print(10);
const int& ref3{ 10 + 30 * 3 };
//const를 붙이면 우측값도 참조가능
//단, 값을 바꿀 수는 없음
std::cout << ref3;
std::cout<<&ref3;
// 16번라인을 벗어나서도 계속 값을 꺼내오거나 주소를 참조할 수 있음
}
________________________________________________________
int main()
{
//실제 rvalue reference
int&& ref4{ 10 };
ref4 = 10;
}
rvalue와 lvalue모두 참조형을 사용할 수 있다는 측면에서 유용하다고 이해하기
더 자세히 알아보려면 클래스라는 개념을 알아야함