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
$
댓글 없음:
댓글 쓰기