flow-vector

참조자는 c++에서 새롭게 추가된 기능이다. 변수의 별명(alias)을 정의하게 된다

별명을 정의한다는 것은 하나의 변수에 두개의 이름이 생기게 되어 별명으로 변수를 사용할 수 있게 된다는 것으로 볼 수 있다.

참조자 사용 방법 및 특징

int a = 10;
int b = 11;
int& c = a;

int& d;
c = a; // compile error

c = b; // a : 10

위와 같은 방법으로 참조자를 선언 할 수 있다.

1) 참조자는 선언과 동시에 초기화 되어야 한다.

예외의 경우

  • 함수의 매개변수로 참조자를 받을때 : 함수가 호출될 때 실제 인수로 초기화 된다.
  • 클래스의 멤버로 사용할 때 : 생성자에서 반드시 초기화 해야함
  • 변수를 extern 선언할 때 : 레퍼런스의 초기식이 이미 외부에 선언이 되있는 경우이기 때문에 가능

2) 참조자는 NULL을 가리킬 수 없다.

3) 한번 특정 변수의 별명으로 지정되면 다른 변수의 별명으로 바뀔 수 없다.

  • 레퍼런스의 대입연산자는 별명의 주체를 바꾸는 것이 아니까 현재 가르키고 있는 변수의 값을 바꾼다.

4) 레퍼런스의 주체는 실제 메모리를 소유하고 있는 l-value 이어야 한다.

int& a = 123; // error : 상수는 l-value가 아님

const int& b = 123; // ok : const로 인해 b를 바꿀 수 없기 때문에 가능

참조자의 쓰임새

  1. 함수의 매개변수로 사용 (call-by-reference)
  • 참조자를 함수의 매개변수로 사용하게 되면 값 자체가 복사가 되어 함수로 전달되는 것이 아니기 때문에 속도가 빠르고, 아주큰 객체를 함수로 전달할 때 유리하다.
  1. 함수의 리턴값으로 사용
  • 연산자 오버로딩시 유용하게 사용됨
  • 지역변수를 참조자로 리턴하는 것을 유의 해야함
    • 함수가 끝나면 사라질 지역변수의 참조자를 반환 하게되면 이상한 메로리 참조가 가능해짐
//복사 대입 연산자 오버로딩

class A
{
    public:
        A& operator=(const A& rhs)
        {
            if (this != &rhs)
            {
                .....
            }
            return (*this);
        }
};

//main.c
int main(void)
{
    A a;
    A b;
    A c;
    a = b = c; // a = (b = c) 와 같은 상황에서 복사 대입 연사자도 참조 반환이 유효함. 

참조자 내부 구현

컴파일러는 참조자를 포인터로 바꾼후 컴파일 하기 때문에 참조자의 내부는 포인터로 구현이 되어 있다.

참조자를 썼을 때 장점은 코드를 깔끔하게 쓸수 있다는 점이다. (*를 남발하지 않아도됨)

출처

  • 아래 링크의 c/c++강좌를 공부 후 정리하였습니다.

SoEn:소프트웨어 공학 연구소

'Computer Science > C,C++' 카테고리의 다른 글

C++ - new, delete 연산자  (0) 2023.03.11
profile

flow-vector

@flow-vector

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!