반응형
reference 변수
- 기존 메모리(변수)에 새로운 이름(alias)을 부여하는 것
- 레퍼런스 변수는 메모리를 할당하지 않는가?
- 단순한 코드의 경우 메모리를 사용하지 않음
- 복잡한 경우(함수 인자로 사용되거나...) 상황에 따라 내부적으로 포인터를 사용
- C++ 표준 문서는 레퍼런스의 동작만 정의 할뿐, 구현은 정의하고 있지 않음
- 반드시 초기화 되어야 함
int main()
{
int n = 10; // 일반 변수
int* p = &n; // 포인터 변수
int& r = n; // 레퍼런스 변수
}
Call By Reference
- 함수 인자의 값을 변경하게 하려면 포인터 또는 레퍼런스를 사용
void Inc1(int n) { ++n; }
void Inc2(int* p) { ++(*p); }
void Inc3(int& r) { ++r; }
int main()
{
int a = 10, b = 10, c = 10;
Inc1(a); // call by value
Inc2(&b); // call by pointer
Inc3(c); // call by reference
std::cout << a << std::endl; // 10
std::cout << a << std::endl; // 11
std::cout << a << std::endl; // 11
}
int main()
{
int n = 0;
scanf("%d", &n); // 인자를 포인터로 전달(call by pointer)
std::cin >> n; // 인자를 레퍼런스로 전달(call by reference)
}
Call by const Reference
- 함수의 인자로 사용한 변수의 값을 변경되지 않게 하려면
- Call by value : 동일한 객체가 메모리에 중복 생성됨
- Const Reference : 메모리 중복 생성이 되지 않고 생성자, 소멸자의 호출을 차단 할 수 있음
- 권장 사항
- primitive type : Call by value // C++에서 기본 제공 타입
- user defined type : Const reference // 사용자 정의 타입
struct Data // user defined type
{
char data[1000];
};
void Foo1(int a) {} // primitive type(call by value)
void Foo2(const Data& a) {} // user defined type(call by const reference)
int main()
{
Data x;
Foo1(1);
Foo2(x);
}
Reference return
- 함수 인자
- call by value : 복사본 생성
- call by reference : 복사본 미생성
- 함수 리턴
- return by value : 복사본(임시 객체)을 리턴(등호 왼쪽에 올 수 없음, lvalue가 될 수 없음)
- return by reference : 원본 리턴(지역 변수는 참조로 리턴하면 안됨)
struct Point
{
int x, y;
};
void F1(Point p) {} // 복사본 생성
void F2(Point& r) {} // 복사본 생성X
Point pt;
Point& Goo() { return pt; }
int main()
{
Goo().x = 20;
std::cout << pt.x << std::endl; // 20
}
rvalue reference
- lvalue vs rvalue
- rvalue : 등호(=)의 오른쪽에만 올 수 있는 것
- lvalue : 등호(=)의 오른쪽과 왼쪽에 모두 올 수 있는 것
- reference 규칙
- lvalue reference : lvalue만 가리킬 수 있음
- const lvalue reference : lvalue, rvalue 모두 가리킬 수 있음
- rvalue reference : rvalue만 가리킬 수 있음
- rvalue reference 활용 분야
- move semantics
- perfect forwarding
int main()
{
int v1 = 0, v2 = 0;
v1 = 10; // ok
10 = v1; // error
v2 = v1;
// lvalue reference
int& r1 = v1; // ok
int& r2 = 10; // error
// const lvalue reference
const int& r3 = v1; // ok
const int& r4 = 10; // ok
// rvalue reference
int&& r5 = v1; // error
int&& r6 = 10; // ok
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ OOP(Object Oriented Programming) (0) | 2019.05.06 |
---|---|
C++ Explicit Casting (0) | 2019.05.06 |
C++ new (0) | 2019.05.06 |
C++ 함수 특징 #2 (0) | 2019.05.05 |
C++ 함수 특징 #1 (0) | 2019.05.05 |