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

+ Recent posts