임시객체

ⓟrogramming/C++ 2016. 5. 11. 21:27
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
(예제1)
#include 
using namespace std;

class Point
{
public:
    int x, y;

    Point(int a = 0, int b = 0) : x(a), y(b) { cout << "ctor" << endl; }
    ~Point() { cout << "dtor" << endl; }
};

int main()
{
    Point p1(1, 2); // p1이라는 이름으로 접근이 가능

    Point(1, 2);    // C++ 에서는 사용자가 임시객체를 명시적으로 만들수도 있다.
                    // unamed object : 이름없는 객체라고도 불림
                    // 임시객체는 수명이 자신을 선언할때 만들어져서 문장의 끝(;) 에서 파괴됨
                    // 임시 객체의 파괴는 "A" print되기 전에 dtor가 print된다.

    Point(1, 2), cout << "X" << endl; // 여기서 임시객체의 수명을 확실히 알수 있다.
                                      // 임시객체는 ; 에서 파괴가 되는데 dtor가 호출되기 전에 X가 찍히는걸 확인할수 있다.

    Point p2(1, 2);
    p2.x = 10; // 1. OK ..p2의 메모리는 계속 존재한다.

    //Point(1, 2).x = 20; // 임시객체는 =의 왼쪽에 올수 없다.
                        // 어차피 파괴될건데 이런 동작은 의미가 없다.
                        // error C2106: '=': 왼쪽 피연산자는 l-value이어야 합니다.

    //___________________________________________________________________________
    cout << &p1 << endl;
    cout << &Point(1, 2) << endl; // error. 임식객체는 주소를 얻을수 없다. (VC에서는 컴파일이 되는데... 표준에서는 안된다고 나와 있음)
                                  // <<프로젝트 속성 -> 언어>>
                                  // 언어 확장 사용 안 함 : 아니오--> 사용한다.
                                  // (의미)마이크로소프트 문법이 포함된다.
                                  // ->예로 바꾼다. (그러면 거의 표준)
                                  // 에러 발생됨!!
    // Point* p = &Point(1, 2); //error

    cout << "A" << endl;
}

(예제2)



#include 
using namespace std;

class Point
{
public:
    int x, y;

    Point(int a = 0, int b = 0) : x(a), y(b) { cout << "ctor" << endl; }
    ~Point() { cout << "dtor" << endl; }
};

int main()
{
    // 임시객체와 참조

    //Point p1;

    //Point& r1 = p1;
    //Point& r2 = Point(); // error C2440: '초기화 중': 'Point'에서 'Point &'(으)로 변환할 수 없습니다.
                         // 임시객체는 참조를 가르킬수 없다.

    const Point& r3 = Point(); // 상수 참조로는 가르킬수 있다.
                               // 수명연장의 수단, r3가 살아 있는 동안에는 임시객체가 살아 있을 수 있다.
                               // 탄생 배경은?
    //r3.x = 10; // error. 임시객체의 수명은 연장되었지만 r3는 const 이다.
    cout << "A" << endl;

    // C++11 의 rvalue reference로 임시객체를 가르킬수 있다.
    Point&& r4 = Point(); // OK...
                          // 앞에 상수가 없기 때문에 값을 바꿀수 있다.
    r4.x = 10; // ok
    // (왜 ravlue reference가 필요한가?) move 와 perfect fowarding을 배우면 알게 된다.

    // 참고
    // int& r5 = 10; // r5를 통해서 10을 바꿀수 없다.
                  // 상수는 참조할수 없다.
    // const int& r6 = 10; // 10을 가르킬게 그러나 바꾸지는 않을테닌깐 허용해줘!! OK.
                        // r6가 10을 가르키기 위해서는 메모리 공간이 잡혀야 한다.
                        // 10의 수명과 r6의 메모리 수명은 같이 간다.
                        // 결국 이것을 임시객체에도 적용하여 상수 참조로는 가르킬수 있다.

    
}
(예제3)

'ⓟrogramming > C++' 카테고리의 다른 글

[Thread] Handling exceptions from thread functions  (0) 2018.01.03
Visual Studio 에서 Boost 사용법  (0) 2016.07.28
rvalue  (0) 2016.05.11
static_assert  (0) 2016.05.10
부분전문화(partial specialization) template  (0) 2016.05.10
블로그 이미지

뚱땡이 우주인

,