Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Formoat's Open Blog

변환 생성자(Conversion Constructor) 본문

C & C++/C++ Basic

변환 생성자(Conversion Constructor)

snd-snd 2019. 9. 22. 11:10

변환 생성자

 

매개변수가 하나뿐인 생성자를 변환 생성자라고 한다.

묵시적 변환을 통해 임시 객체가 생성될 가능성을 가지고 있다.

 

묵시적 변환이란 어떠한 함수가 있을 때 이 함수의 매개변수의 자료형이 객체라면 실인수의 값은

그 자료형에 맞는 객체를 대입해야 정상적으로 작동하는 데 변환 생성자의 경우 묵시적 변환을 통해서

그 객체가 아닌 객체가 가지고 있는 멤버의 타입으로도 생성자의 호출이 이루어지는 경우를 말한다.

 

#include "stdafx.h"
#include <iostream>
using namespace std;

class CMyData
{
public:
	CMyData(int x) : nData(x)
	{
		cout << "변환 생성자 호출" << endl;
	}

	int GetData() const
	{
		return nData;
	}

private:
	int nData;
};

void TestFunc(const CMyData &rhs) // 분명 TestFunc 함수는 매개값으로 CMyData 객체의 참조를 받는다.
{
	cout << "TestFunc(): " << rhs.GetData() << endl;
}

int main()
{
	CMyData a(100);
	TestFunc(a); // 일반적인 함수 호출 경우

	TestFunc(1000); // 인자값으로 1000을 넣었는데도 컴파일 오류가 발생하지 않는다.
	return 0;
}

 

위 코드의 핵심은 32번 행이다.

분명히 TestFunc 함수는 22번행의 정의에서도 알 수 있듯 CMyData 객체에 대한 참조를 인자값으로 받는다.

하지만 32번 행에서 TestFunc 함수를 호출하면서 인자값으로 1000을 주었는데 컴파일 오류가 발생하지 않는다.

 

이는 컴파일러가 TestFunc 함수를 호출하면서 묵시적 변환을 통해서 1000이라는 인자값을

CMyData의 변환 생성자의 매개값으로 활용해 임시 객체를 만들고 그 임시 객체를 인자값으로 넣는다.

 

곧 TestFunc(1000)은 TestFunc( CMyData(1000) )으로 변환 된다.

 

묵시적 변환은 어찌보면 생산성을 높일 수 있지만 사용자 코드만 봤을 때 이 코드가 실제 어떻게 작동되는지

알아보기 어려워 오해가 발생할 수 있다. 때문에 이를 막기위해 변환 생성자를 정의할 경우 앞에 'explicit' 라는

키워드를 사용해 묵시적 변환을 막는다.

'C & C++ > C++ Basic' 카테고리의 다른 글

연산자 오버로딩(Operator Overloading)  (0) 2019.09.22
이동 생성자(Move Constructor)  (0) 2019.09.22
복사 생성자(Copy Constructor)  (0) 2019.09.22
클래스(Class)  (0) 2019.09.21
네임 스페이스(Namespace)  (0) 2019.09.21
Comments