참조와 const (Reference and const)
Reference to const value
const 값에 대한 포인터를 선언하는 것처럼 const 값에 대한 참조를 선언할 수 있다. const 키워드를 사용하여 참조를 선언하면 된다.
const int value = 5;
const int& ref = value; // ref is a reference to const value
Initializing references to const values
const 참조는 non-const 값, const 값 및 r-value로 초기화할 수 있다.
int x = 5;
const int& ref1 = x; // okay, x is a non-const l-value
const int y = 7;
const int& ref2 = y; // okay, y is a const l-value
const int& ref3 = 6; // okay, 6 is an r-value
상수를 가리키는 포인터처럼 const 값에 대한 참조는 const가 아닌 값을 참조할 수 있다. 이때 참조 접근을 하면 const가 아니어도 const로 간주한다.
int value = 5;
const int& ref = value; // create const reference to variable value
value = 6; // okay, value is non-const
ref = 7; // illegal -- ref is const
const에 대한 참조는 간단히 상수 참조(const reference)라고 한다.
References to r-values extend the lifetime of the referenced value
r-value는 표현식 범위를 가지고 있다. 즉, 값이 생성된 표현식 끝에서 소멸한다.
std::cout << 2 + 3; // 2 + 3 evaluates to r-value 5, which is destroyed at the end of this statement
그러나 const에 대한 참조가 r-value로 초기화하면, r-value의 수명이 참조형 변수의 수명에 맞게 확장된다.
int somefcn()
{
const int& ref = 2 + 3; // normally the result of 2+3 has expression scope and is destroyed at the end of this statement
// but because the result is now bound to a reference to a const value...
std::cout << ref; // we can use it here
} // and the lifetime of the r-value is extended to here, when the const reference dies
Const references as function parameters
함수 매개 변수로 사용되는 참조는 const일 수 있다. 이렇게 하면 복사본을 만들지 않고 인수에 접근할 수 있으며, 함수는 참조되는 값을 변경하지 못한다.
// ref is a const reference to the argument passed in, not a copy
void changeN(const int& ref)
{
ref = 6; // not allowed, ref is const
}
const 참조 매개 변수를 사용하여 const l-value, non-const l-value, 리터럴 및 표현식을 전달할 수 있다.
#include <iostream>
void printIt(const int &x)
{
std::cout << x;
}
int main()
{
int a = 1;
printIt(a); // non-const l-value
const int b = 2;
printIt(b); // const l-value
printIt(3); // literal r-value
printIt(2+b); // expression r-value
return 0;
}
// 1234
포인터나 기본 자료형이 아닌 타입의 값비싼 복사본을 만들지 않으려면 일반적으로 참조로 전달하는 게 좋다. 기본 자료형은 함수가 값을 변경해야 하는 경우가 아니라면 값으로 전달하자.
번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/6-11a-references-and-const/ 입니다.