2005년 11월 6일 일요일

C++에서 object를 return하기

C++에서 object를 return하면
1. copy constructor에 의해 temporal object가 생긴다.
2. return할 때 사용했던 local object variable은 소멸된다.
3. return 값을 변수에 받아 넣으면 assign operator도 불린다.
4. 다음 줄로 넘어갈 때 temporal object가 소멸된다.

흔히 하는 실수들
. copy constructor를 만들지 않으면 default로 알아서 불리면서
  문법에러는 내지 않지만, 우리가 원하는 대로 복사가 안된다.
. copy constructor의 argument로 const를 적어주면 return값을 const가 아니므로
  우리가 만든 것이 불리지 않는 다.
. assign operator가 불리게 하기 위해서는 변수의 declaration과 assign을 다른 줄로 분리한다.

예)
#include <iostream>

class A
{
    public:
    A()
    {
        cout << "This is simplest constructor. this : " << this << endl;
        m_i = NULL;
    }

    A(const int size)
    : m_size(size)
    {
        cout << "This is basic constructor. this : " << this << endl;
        m_i = new int[size];
    }

    A(A& value)
    {
        cout << "This is copy constructor. this : " << this << endl;
        m_size = value.m_size;
        m_i = new int[m_size];
        for (int i = 0; i < m_size; i++) {
            m_i[i] = value.m_i[i];
        }
    }

    ~A()
    {
        cout << "This is default destructor. this : " << this << endl;
        delete [] m_i;
    }

    void print()
    {
        cout << "m_i : this : " << this << " ";
        for (int i = 0; i < m_size; i++) {
            cout << m_i[i] << "," ;
        }
        cout << endl;
    }

    A& operator=(const A& value)
    {
        cout << "This is assign operator. this : " << this << endl;

        for (int i = 0; i < m_size; i++) {
            m_i[i] = value.m_i[i];
        }

        return *this;
    }

    private:
    int *m_i;
    int m_size;

    friend A good(int i);
};

A good(int value)
{
    A x(5);
    for (int i = 0; i < 5; i++)
    {
        x.m_i[i] = value;
    }

    return x;
}

int main()
{
    A y(5);
    y = good(3);
    y.print();

    return 0;
}

$ g++ a.cpp -g -W -Wall
$ ./a.out
This is basic constructor. this : 0xbfbffa48 <- y
This is basic constructor. this : 0xbfbff9f8 <- x
This is copy constructor. this : 0xbfbffa34 <- 임시 object
This is default destructor. this : 0xbfbff9f8 <- x
This is assign operator. this : 0xbfbffa48 <- y
This is default destructor. this : 0xbfbffa34 <- 임시 object
m_i : this : 0xbfbffa48 3,3,3,3,3,
This is default destructor. this : 0xbfbffa48 <- y
$

댓글 없음:

댓글 쓰기