반응형
레퍼런스 (reference, 참조)
이미 존재하는 변수에 추가적인 별칭 부여
#include <iostream>
int main()
{
int n = 10;
int& r = n;
r = 20; // 값 변경
std::cout << n << std::endl; // 20
// 동일한 주소를 가리킴
std::cout << &n << std::endl;
std::cout << &r << std::endl;
}
C 언어에서는 void swap(int* p1, int* p2) 와 같이
call by pointer 방식을 사용했다면
C++에서는 void swap(int& r1, int& r2) 와 같이
call by reference 형태가 가능하다.
포인터 방식보다는 간결하게 코드를 작성할 수 있다.
#include <iostream>
#include <algorithm>
void swap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void swap(int& r1, int& r2)
{
int temp = r1;
r1 = r2;
r2 = temp;
}
int main()
{
int x = 10, y = 20;
swap(&x, &y);
printf("%d %d\n", x, y); // 20 10
swap(x, y);
printf("%d %d\n", x, y); // 10 20
}
Q) 함수 인자 전달 방식에서 어떤 타입을 주는 것이 좋을까?
A) 인자 타입에 따라 다르다.
• user define
→ const reference 사용
일반적으로 타입 크기가 primitive type 보다 크며,
복사 생성자 호출 오버헤드를 줄일 수 있다.
• primitive type
→ call by value 사용
타입 크기가 크지 않은 편이기에
reference 보다 더 많은 컴파일러가 최적화 지원
struct Pos
{
int x, y;
};
// ------------------------------
// primitive type
void f3(int n) {} // Good
void f4(const int& r) {}
// user define
void f1(Pos r) {}
void f2(const Pos& r) {} // Good
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] reinterpret_cast 필요성 및 사용 방법 (2) | 2025.01.21 |
---|---|
[C++] [STL] Vector 사용 방법 (1) | 2025.01.20 |
[C++] Lambda expression 지역 변수 캡처 (2) | 2025.01.18 |
[C++] 후위 반환 타입 (suffix return type) (1) | 2025.01.15 |
[C++] 함수 삭제 function delete (0) | 2025.01.14 |
댓글