참조자는 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를 바꿀 수 없기 때문에 가능
참조자의 쓰임새
- 함수의 매개변수로 사용 (call-by-reference)
- 참조자를 함수의 매개변수로 사용하게 되면 값 자체가 복사가 되어 함수로 전달되는 것이 아니기 때문에 속도가 빠르고, 아주큰 객체를 함수로 전달할 때 유리하다.
- 함수의 리턴값으로 사용
- 연산자 오버로딩시 유용하게 사용됨
- 지역변수를 참조자로 리턴하는 것을 유의 해야함
- 함수가 끝나면 사라질 지역변수의 참조자를 반환 하게되면 이상한 메로리 참조가 가능해짐
//복사 대입 연산자 오버로딩
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++강좌를 공부 후 정리하였습니다.
'Computer Science > C,C++' 카테고리의 다른 글
C++ - new, delete 연산자 (0) | 2023.03.11 |
---|