C에서는 어떠한 변수를 가리키려면 반드시 포인터를 사용해야 했다.
C++에서는 포인터 말고도 레퍼런스(참조자)라는 방식으로 다른 변수나 상수를 가리킬 수 있다.
#include <iostream>
int main()
{
int a = 3;
int& another_a = a; // 참조자 사용
another_a = 5;
std::cout << "a : " << a << std::endl;
std::cout << "another_a : " << another_a << std::endl;
return 0;
}
위 코드에서는 a 의 참조자 another_a를 정의하였는데, 참조자는 가리키고자 하는 타입 뒤에 &를 붙이면 된다.
참조자를 선언한다는 것은 another_a는 a의 또 다른 이름이라고 컴파일러에게 알려주는 것이다. 따라서 위 코드에는 another_a에 5를 대입하였지만 a의 값이 5로 바뀐 것을 확인할 수 있다.
레퍼런스(참조자)는 포인터와 비슷하지만 몇가지 차이점이 있다. 레퍼런스는 반드시 정의할 때 어떤 변수나 상수의 별명이 될 것인지 지정해야 한다. int& another_a; 와 같은 형식의 코드는 불가능하다. 또한 레퍼런스가 한 번 별명이 되면 더 이상 다른 변수를 참조 할 수 없다.
레퍼런스는 메모리 상에 존재하지 않을 수도 있다. 위 코드의 경우 another_a 변수는 메모리 상의 공간을 차지하지 않고 another_a가 쓰이는 자리를 모두 a로 바꾸면 되기 때문이다.
#include <iostream>
int change_var(int& p)
{
p = 3;
return 0;
}
int main()
{
int num = 5;
std::cout << num << std::endl;
change_var(num);
std::cout << num << std::endl;
return 0;
}
위 코드에서는 함수의 인자로 레퍼런스를 받고 있다. 위 설명에서 int& p; 와 같은 코드는 사용할 수 없다고 했지만 함수의 인자로 사용하게 되면 int& p = num;의 의미가 되어 상관없다. 또한 인자로 변수를 넣을 때에도 포인터와 다르게 &num이 아닌 num을 넣으면 된다. 따라서 change_var()함수의 p=3; 이라는 코드는 num = 3; 이라는 코드와 동일하다.
#include <iostream>
int main()
{
const int& ref = 4;
std::cout << ref << std::endl;
return 0;
}
위 코드와 같이 리터럴 값을 참조하려면 상수 참조자로 선언해야 한다.
레퍼런스의 배열은 C++ 규정상 표준안 8.3.2/4 에 선언할 수 없다고 명시되어 있다.
그러나 반대로 배열들은 레퍼런스로 참조가 가능하다.
#include <iostream>
int main()
{
int arr[3] = {1, 2, 3};
int(&ref)[3] = arr;
ref[0] = 2;
ref[1] = 3;
ref[2] = 1;
std::cout << arr[0] << arr[1] << arr[2] << std::endl;
return 0;
}
위 코드와 같이 배열의 크기를 명시하여 배열을 참조할 수 있다.
#include <iostream>
int function()
{
int a = 5;
return a;
}
int main()
{
const int& c = function();
std::cout << c << std::endl;
return 0;
}
위 코드처럼 참조자가 아닌 값을 리턴하는 함수 값을 참조자로 받을 수 있다. 함수의 리턴값을 참조자로 받으려면 const로 선언해줘야 한다.
'Language > C, C++' 카테고리의 다른 글
[C++] 함수 오버로딩 (Function Overloading) (0) | 2021.09.07 |
---|---|
[C++] new, delete (0) | 2021.08.24 |
[C++] 입출력 (0) | 2021.08.21 |
[Project H4C] C언어 코딩도장(6) (0) | 2021.03.02 |
[C] 문자 단위 입출력 함수 (0) | 2021.01.15 |