반응형

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

+ Recent posts