검색결과 리스트
explicit에 해당되는 글 1건
- 2010.10.20 explicit
글
01.class
TestClass
02.
{
03.
public
:
04.
TestClass(
int
nParam = 1) : m_Num(nParam)
05.
{
06.
std::cout <<
"생성자 호출"
<< std::endl;
07.
}
08.
~TestClass(){}
09.
10.
private
:
11.
int
m_Num;
12.
};
13.
14.
void
main()
15.
{
16.
TestClass TestObj1 = TestClass(1);
17.
TestClass TestObj2 = 2;
18.
TestClass TestObj3(3);
19.
TestObj1 = 4;
20.
}
1.
TestClass TestObj2 = 2;
2.
TestObj1 = 4;
이 부분입니다.
TestClass라는 클래스는 생성자의 매개변수로 int형 데이터를 받아오는 클래스로써 int형과 상호호환은 염두해두고 있지 않는 클래스입니다. 연산자 오버로딩도 하지 않았구요. 이 부분에 있어서 VisualStudio2008 C++컴파일러는 사용자의 편의를 위해 묵시적으로 변환하여 임시 객체 생성 후 해당 객체에 대입하게 됩니다.
explicit 키워드는 이럴 경우에 사용하는 것으로 명시적으로 생성자를 호출해야만 하는 상황이 아니면 절대 생성자를 호출해주지 않도록 해주는 것입니다. 그렇다면 똑같은 소스코드에 이 키워드를 삽입하면 어떻게 되는지 살펴보도록 하겠습니다.
아래의 소스를 보세요.
02.
{
03.
public
:
04.
explicit
TestClass(
int
nParam = 1) : m_Num(nParam)
05.
{
06.
std::cout <<
"생성자 호출"
<< std::endl;
07.
}
08.
~TestClass(){}
09.
10.
private
:
11.
int
m_Num;
12.
};
13.
14.
void
main()
15.
{
16.
TestClass TestObj1 = TestClass(1);
17.
TestClass TestObj2 = 2;
18.
TestClass TestObj3(3);
19.
TestObj1 = 4;
20.
}
위 소스를 컴파일 해보면 오류가 두개 발생합니다.
첫번째 오류는 TestClass TestObj2 = 2; 에서 int형에서 TestClass형으로 변환할 수 없다는 것이고,
두번째 오류는 TestObj1 = 4; 에서 TestClass에 속한 "=" 연산자 중 우변에 int형을 받는 것을 찾을 수 없다는 것입니다.
main()함수의 첫번째 줄과 두번째 줄은 정상적인 방법을 통한 객체생성 및 생성자 호출조건임을 알 수 있죠.
아주 불편해보이죠?
굳이 편한 묵시적 변환기능을 놔두고 왜 굳이 8글자나 더 써가며 explicit이라는 키워드를 사용하고, 또 여기서 동반되는 소스코드의 수정을 왜 하는지...
이러한 묵시적인 기능이 대형 프로젝트에서는 심각하지만 찾기 매우매우 어려운 버그를 동반할 가능성이 농후하기 때문입니다. 특히나 4번째 줄에 있는 TestObj1 = 4; 이 부분은 정말 말로 설명할래야 하기도 싫은 명백한 오류임에도 우리의 컴파일러는 친절히 컴파일을 해줍니다.
이것이 explicit 키워드의 역할입니다.
'프로그래밍' 카테고리의 다른 글
VS2008 컴파일러 옵션 (1) | 2010.10.21 |
---|---|
mutable (0) | 2010.10.20 |
ms vs에서 포인터 변수에 들어가있는 값의 비밀 (0) | 2010.08.18 |
API 파일 처리 유용함수 (0) | 2010.08.10 |
릴리즈 디버깅시 최적화 하는것 막기 (0) | 2010.08.04 |