leesangwon0114

I am Research Engineer. Currently working in KT.

C++Intermediate 19. temporary object#2

14 Nov 2018 » c++

codenuri 강석민 강사 강의 내용기반으로 정리한 내용입니다.


값 리턴과 참조 리턴

#include <iostream>
using namespace std;

Point p; // 전역변수

Point foo() // 값 리턴 : 임시객체가 리턴됨
{
    return p;
}

Point& goo() // 참조 리턴 : 임시객체가 생성되지 않는다.
{
    return p;
}

int main()
{
    // Point ret = foo();
    foo().x = 10; // error

    goo().x = 20; // ok.

    cout << p.x << endl; // 20

    vector<int> v(10, 2);
    v[0] = 10; // v.operator[](0) = 10;
}
int x;

int foo() {return x;}
int& goo() {return x;}

int main()
{
    foo() = 10; // error
    goo() = 10; // ok
}

임시객체가 생성되는 다양한 경우

#include <iostream>
using namespace std;

struct Base
{
    int v = 10;
};
struct Derived : public Base
{
    int v = 20;
};

int main()
{
    Derived d;
    cout << d.v << endl; // 20
    cout << d.Base::v << endl; // 10
    cout << (static_cast<Base>(d)).v << endl; // 10 -> Base 타입의 임시객체 10
    cout << (static_cast<Base&>(d)).v << endl; // 10

    (static_cast<Base>(d)).v = 30; // error
    (static_cast<Base&>(d)).v = 30; // ok
}

값 캐스팅 : 임시객체 생성

참조 캐스팅 : d를 볼 때 Base로 본다는 의미


연산자와 임시객체


// 후위형. 참조리턴 불가(지역변수를 참조리턴할 수 없음)
// 그냥 n 리턴하면 변경된 값이 나옴(이전값을 리턴해야함) => temp 이용
int operator++(int& n, int) // 전위형과 구분하기 위해 int 존재
{
    int temp = n;
    n = n + 1;
    return temp;
}
// 전위형.
int& operator++(int& n)
{
    n = n + 1;
    return n;
}

int main()
{
    int n = 3;

    n++; // operator++(n, int)
    ++n; // operator++(n)

    ++(++n)

    n++ = 10; // error
    ++n = 10; // ok.    
}

임시객체와 멤버함수

#include <iostream>
using namespace std;

class Test
{
public:
    int data;
    void foo() & { cout << "foo&" << endl; } // lvalue 객체에 대해서만 호출.
    void foo() && { cout << "foo&&" << endl; }

    int& goo() & { return data; }
};

int main()
{
    Test t;
    t.foo();
    int& ret = t.goo();

    int& ret2 = Test().goo(); // error

    Test().foo(); // 임시객체이므로 error -> && 추가해 rvalue에 대해 호출
}