참고 : 소년코딩 - C++ 08.03 - 참조로 전달 (Pass by reference), 전문가를 위한 C++ 개정5판
참조자(&)
- 사용 이유
- 큰 구조체 or 클래스를 전달할 떄, 값의 복사를 사용하면 큰 비용
- 포인터와 달리 항상 null 값이 될 수 없어 안정성이 좋음
- 기본적으로 const 속성
- 값 사용이 편함 (접근할 떄 *, & 같은거 안붙이고 써도 댐)
- 연산자 오버로딩에 주로 사용 (lvalue에 값을 직접 대입할 떄)
- 주의점
- 생성하자마자 초기화가 필요
- 레퍼런스 대상 변경 불가
int x {3}, y{4}; int& xRef{x}; xRef = y; // xRef가 y참조로 바뀌는게 아닌 x 값이 4로 변경
- 리터럴 값 할당 불가
const int& a {5};
와 같이 const 레퍼런스로만 가능
- 출력 매개 변수보다 값으로 리턴이 바람직
- 컴파일러가 불필요한 복제 작업 제거를 하기 때문에, 오히려 최적화가 더 잘됨
- 리턴값 최적화(RV), 이름있는 리턴값 최적화(NRVO) 같은 복제 생략이 적용
- 컴파일러가 불필요한 복제 작업 제거를 하기 때문에, 오히려 최적화가 더 잘됨
포인터 참조
- 포인터 추가 복사 방지
- 포인터가 복사되지 않음
- 포인터 주소 수정 가능
- 기존에는 포인터가 참조하는 값을 변경하는 거지, 포인터가 가르치는 주소 변경은 불가
- 안정성 증가
- null 포인터, 잘못된 포인터 실수 방지 가능
void foo(int*& ptr)
- null 포인터, 잘못된 포인터 실수 방지 가능
배열 참조
- 배열의 크기를 명시해야함
void foo(int (&ptr)[4])
- 가변 배열의 경우에는 포인터로 전달
void foo(int* ptr)
'공부 > C++' 카테고리의 다른 글
추상 클래스 (0) | 2025.03.15 |
---|---|
문자열 (1) | 2025.03.14 |
템플릿(Template) (0) | 2025.03.08 |
상속 (0) | 2025.03.07 |
foreach 방식 (범위 기반 for 문) (0) | 2025.03.05 |