서의 공간

C++ 복사 생성자와 임시 객체 본문

C++/Syntax, Features

C++ 복사 생성자와 임시 객체

홍서의 2020. 12. 13. 07:54

1. 복사 생성자

Shallow Copy

값이든 포인터이든 그대로 복사

 

Deep Copy

포인터이라면 값을 복사

2. 대입 연산자

a = b;

식에 왼쪽은 l-value(l: locator), 오른쪽은 r-value

왼쪽에는 변수가 와야하고, 오른쪽에는 변수 또는 상수가 와야함.

왼쪽에서는 overwrite가 발생하고, 오른쪽에서는 읽기가 발생함.

기본 데이터 타입의 연산에 대해 연산자 오버로딩은 불가능함.(int + int)

클래스간의 연산자 오버로딩이 가능

디폴트 대입 연산자는 Shallow Copy 한다.

복사 생성자를 구현하면 대입 연산자도 구현해야 한다.

3. 묵시적 변환

변환 생성자: 파라미터 1개를 갖는 생성자

클래스가 다른 함수의 파라미터로 넘어갈 때, 묵시적 변환이 이루어짐.

class CTest
{
public:
	CTest() { mData = 0; }
    CTest(int num) { mData = num; }
	int GetData() const { return mData; }
private:
    int mData;
}

void TestFunc(const CTest& param)
{
	cout << param.GetData() << endl;
}

int main()
{
	TestFunc(5);
	return 0;
}

TestFunc() 함수의 파라미터 5는 CTest 클래스의 CTest(int) 생성자를 호출하여 객체를 생성함. 묵시적 변환이 이루어짐. 묵시적 변환을 막기 위해서 변환 생성자에 explicit 키워드를 붙여준다. 그럼 명시적으로 파라미터에 객체를 넣지 않으면 묵시적 변환이 이루어 지지 않음.

4.

아래와 같이 하면 cout에서 자동으로 클래스를 int 자료형으로 인식하여 출력한다. 자세하게는 클래스의 operator int가 호출된다.

class CTest
{
public:
	CTest() { mData = 0; }
    CTest(int num) { mData = num; }

	operator int(void)
	{
		return mData;
	}
private:
	int mData;
}

int main()
{
	CTest a(10);
    
    cout << a << endl;
    return 0;
}

5. 임시 객체

int TestFunc()
{	
	// ...
	return nData;
}

int main()
{
	// ...
    int nResult = TestFunc();
}

TestFunc()가 리턴하면 지역변수 nData는 사라진다. 그럼 어떻게 nResult에 대입이 되는가? 디스어셈블리를 확인하면 EAX 레지스터(double 형식이면 다른 레지스터)에 임시결과가 저장되고. nResult에 EAX 레지스터 값을 대입하는 것이다. 

int a;

a = 3 + 4;

에서 a에 7을 대입하기 전에 3 + 4의 임시결과인 7이 있다. 이것은 클래스 일때 문제가 발생한다.

CMyList a = b + c;  (여기서 b, c도 CMyList이다)

일 때 생성자는 총 4번 호출된다. 임시객체가 발생.

문제는 CMyList b, c가 각각 10만개의 레코드가 있는 리스트라면, 순간적으로 b+c의 임시객체의 레코드 20만개, 이 임시객체를 a에 복사하면서 만들어지는 레코드 20만개, 기존 b, c의 각 10만개. 총 60만개나 생김.

a = 3 + 4;

a는 l-value: l-value는 변수만 가능  

3 + 4는 r-value: r-value는 변수, 상수 다 가능

위 식에서 발생하는 임시객체 7은 *상수객체*이다. 변수가 아님.

임시객체 7의 생명주기는 3 + 4할 때 생성되고, a에 대입(복사) 후 소멸.

6. 생성자 종류

디폴트 생성자

변환 생성자(매개변수 1개인 생성자)

복사 생성자

이동 생성자: 임시객체가 복사될 때 이동 생성자를 구현했다면 이동 생성자가 호출 됨

 

 

'C++ > Syntax, Features' 카테고리의 다른 글

C++ 템플릿  (0) 2020.11.27
C++ 키워드  (0) 2020.11.27
C++ STL(Standard Template Library)  (0) 2020.11.27
C++ Standard Library (표준 라이브러리)  (0) 2020.11.27
Comments