목록
Reference_ 참조자
int a = 3;
int& another_a = a;
어떻게 보면 참조자와 포인터는 상당히 유사한 개념이다. 포인터 역시 다른 어떤 변수의 주소값을 보관함으로써 해당 변수에 간접적으로 연산을 수행할 수 있기 때문. 하지만 레퍼런스와 포인터는 몇 가지 중요한 차이점이 있다.
레퍼런스와 포인터의 차이점
레퍼런스는 반드시 처음에 누구의 별명이 될 것인지 지정해야함
int& another_a; // error
int* p; // no problem
레퍼런스가 한 번 별명이 되면 절대로 다른 이의 별명이 될 수 없다.
레퍼런스의 또 한 가지 중요한 특징으로 한 번 어떤 변수의 참조자가 되버린다면, 더이상 다른 변수를 참조할 수 없게 됨.
int a = 10;
int &another_a = a; // another_a 는 이제 a 의 참조자
int b = 3;
another_a = b; // a=b 와 동치
&another_a = b; // error
레퍼런스는 메모리 상에 존재하지 않을 수도 있다.
아래와 같이 포인터 p를 정의 한다면
int a = 10;
int* p = &a;
p는 메모리 상에서 8 바이트를 차지한다.
int a = 10;
int &another_a = a;
그런데 레퍼런스의 경우 위와 같은 상황이라면, another_a가 쓰이는 자리는 a로 바꿔치기 하면 되기 때문에, 이 경우 레퍼런스는 메모리 상에 존재하지 않게 된다. 물론 그렇다고 해서 항상 존재하지 않은 것은 아님
#include <iostream>
int change_val(int &p) {
//p가 정의되는 순간은 change_val(number)로 호출할때 이므로 가능하다.
p = 3;
return 0;
}
int main() {
int number = 5;
std::cout << number << std::endl;
change_val(number);
std::cout << number << std::endl;
}
💡 C++ 문법 상 참조자의 참조자를 만드는 것은 금지되어 있음
💡 std :: cin 은 reference로 받아서 scanf처럼 변수 앞에 &를 명시하지 않아도 됨
상수에 대한 참조자
int &ref = 4;
error C2440: 'initializing' : cannot convert from 'int' to 'int &'
상수값 자체는 리터럴이기 때문에 위와 같이 레퍼런스로 참조하면 리터럴의 값을 바꾸는 행위가 가능하게 됨. 따라서 C++ 문법 상 상수 리터럴을 일반적인 레퍼런스가 참조하는것은 불가능하게 되어있음
const int &ref = 4;
int a = ref; // a = 4