참고 : 소년코딩 - 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)

배열 참조

  • 배열의 크기를 명시해야함
      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

+ Recent posts

let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });