ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 참조(reference) 변수
    개발/C++ 2021. 4. 17. 17:20

    레퍼런스는 변수에 별칭을 붙이는 것입니다. 어셈블리어를 보면 레퍼런스는 포인터와 같습니다. 포인터를 사용하기 쉽게 해주는 문법이라고 봐도 될 것 같습니다. cppreference의 문서에 따르면, 레퍼런스는 객체가 아니기 배열도 있을 수 없고 포인터도 가질 수 없으며 레퍼런스의 레퍼런스도 가질 수 없습니다.

    포인터와 레퍼런스는 같습니다

     

    레퍼런스는 기본적으로 변수로 초기화합니다만, 리터럴로 초기화 하는 것도 가능합니다. 이 경우 const를 반드시 붙여야 합니다. 리터럴은 기본적으로 변경될 수 없는 값이기 때문입니다.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        // int& num = 1 // error
    	const int& num = 1;
    	const string& str = "Test";
    }

     

    다음 코드의 출력 결과를 한 번 생각해보시길 바랍니다. 레퍼런스 변수는 원본이 변경되면 같이 변경되며, 레퍼런스 변수를 변경하면 원본도 변경됩니다. 다음과 같이 const를 붙여서 초기화하면 어떻게 될까요.

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	float fNum = 1.f;
    	const int& ref = fNum;
    
    	fNum = 10.1f;
    
    	cout << fNum << endl;
    	cout << ref << endl;
    }

    const로 참조 변수를 만들었기 때문에 수정을 못하는 것도 맞지만 ref에 임시 객체가 전달되기 때문에 원본에 접근할 수가 없는 것이기도 합니다. 원본을 변경하지 않아야 하는 상황에서 안전성이 보장됩니다.

     

    함수 안에서 만든 지역변수가 아닌, 함수 밖에서 선언된 변수를 함수 내에서 반환할 때 참조자를 이용하면 다음과 같은 문법도 가능합니다.

    #include <iostream>
    using namespace std;
    
    int& refFunc(int& num)
    {
    	return num;
    }
    
    int main()
    {
    	int num = 5;
    	refFunc(num) = 10;
    	cout << num << endl;
    }

     

    댓글

Designed by Tistory.