참조는 이미 있는 객체의 다른 이름이다. 선언할 때 반드시 객체를 묶어야 하고, 나중에 다른 객체를 다시 묶을 수 없다.

C++ 9. 참조와 const의 핵심 흐름도
그림. 참조는 객체를 소유하지 않으므로 원본 수명이 더 길어야 한다.

참조는 별명이 된다

int score = 3;
int& alias = score;
alias = 4;             // score도 4
const int& view = score;
// view = 5;           // 컴파일 오류

함수가 `int&`를 반환하면 호출자는 그 객체를 고칠 수 있다. 지역 변수의 참조를 반환하면 함수가 끝난 뒤 그 객체는 사라진다. 반환된 참조를 쓰는 것은 미정의 동작이다.

const가 붙는 자리

`const int*`는 가리키는 값을 못 고치고, `int* const`는 포인터 자체에 다른 주소를 못 넣는다. 멤버 함수 뒤의 `const`는 그 함수가 객체의 관찰 가능한 상태를 바꾸지 않는다는 뜻이다. const 객체는 const 멤버 함수만 호출할 수 있다.

임시 값에 붙은 const 참조는 그 참조가 사는 동안 임시를 연장한다. 비const 참조는 임시 값에 묶이지 않는다.