C++의 참조(&)

사실 &기호 볼때마다 그냥 C포인터 생각나서 그런건가 싶어서 그냥 넘겼는데… (죄송합니다)

그런데 찾아보니 비슷하면서도 전혀 달랐다.


참조

변수의 별칭으로 생각하십시오.

C의 포인터는 변수의 주소를 가리키지만 참조는 변수의 또 다른 이름처럼 느껴집니다.

따라서 참조가 메모리에 없는 경우가 많습니다.

  int a = 10;
  int& ref_a = a;
  
  ref_a = 5;
  
  cout << "ref_a: " << ref_a << endl;
  cout << "a: " << a << endl;
  
  // ref_a: 5
  // a: 5

샘플 코드를 실행하면 ref_a와 a 모두 결과 값이 5입니다.

변수의 참조를 조작하는 것은 해당 변수를 조작하는 것과 같습니다.

포인터와의 차이점

  1. 포인터는 선언할 때 초기화할 필요가 없습니다.


    참조는 선언과 함께 초기화되어야 하며 참조된 변수는 수정할 수 없습니다.

  2. 포인터에 대한 포인터를 생성하면 int ** 형태로 선언할 수 있지만
    리퍼러의 리퍼러가 없습니다.

    b를 a에 대한 참조로 선언하고 c를 b에 대한 참조로 선언하면 b와 c 모두 a를 참조합니다.

int a = 5;
int& b = a;
// b를 참조한다고 c가 참조자의 참조자가 되는 것은 아님.
// b와 c 모두 "a의 참조자"
int& c = b;

강하게 함

상수 참조

상수를 참조하는 것은 불가능합니다.

정수 &ref = 5; -> 컴파일 오류

그러나 이것은 참조를 상수로 선언함으로써 가능합니다.

const int &ref = 5; -> 알았어

배열 및 참조

참조로 배열의 내용을 정의할 수 없습니다.

int& ref(5) = 에이; -> 컴파일 오류

그러나 이것은 배열 자체를 참조로 선언하여 수행할 수 있습니다.

int(&ref)(5) = 에이; -> 알았어

지역 변수 참조

함수가 종료되면 지역 변수는 메모리에서 제거됩니다.

지역 변수에 대한 참조를 반환하지 마십시오. (변수가 참조되지 않음)