explicit 키워드
C & C++ 관련 :
2010. 3. 30. 18:00
반응형
출처 : http://allsoft.egloos.com/4634538
명시적으로 생성자를 호출해야만 하는 상황이 아니면 절대 생성자를 호출해 주지 않도록 해주는 것.
다음 소스 코드 실행시 에러 두개 발생. 찾아보자.
class TestClass
{
public:
explicit TestClass(int nParam = 1) : m_Num(nParam)
{
std::cout << "생성자 호출" << std::endl;
}
~TestClass(){}
private:
int m_Num;
};
void main()
{
TestClass TestObj1 = TestClass(1);
TestClass TestObj2 = 2;
TestClass TestObj3(3);
TestObj1 = 4;
}
첫번째 오류는 TestClass TestObj2 = 2; 에서 int형에서 TestClass형으로 변환할 수 없다는 것이고,
두번째 오류는 TestObj1 = 4; 에서 TestClass에 속한 "=" 연산자 중 우변에 int형을 받는 것을 찾을 수 없다는 것이다.
만약 explicit 키워드를 써주지 않으면 제대로 컴파일 된다고 나올 것이다.
굳이 묵시적인 변환기능을 놔두고 명시적으로 explicit 키워드를 써주는 것일까?
대형 프로젝트에서 상당히 찾기 어려운 버그로 잠재되어 숨어있을 가능성이 높기 때문이다.
기본적이지만 꼭 알아두도록 하자.
다음 소스 코드 실행시 에러 두개 발생. 찾아보자.
class TestClass
{
public:
explicit TestClass(int nParam = 1) : m_Num(nParam)
{
std::cout << "생성자 호출" << std::endl;
}
~TestClass(){}
private:
int m_Num;
};
void main()
{
TestClass TestObj1 = TestClass(1);
TestClass TestObj2 = 2;
TestClass TestObj3(3);
TestObj1 = 4;
}
첫번째 오류는 TestClass TestObj2 = 2; 에서 int형에서 TestClass형으로 변환할 수 없다는 것이고,
두번째 오류는 TestObj1 = 4; 에서 TestClass에 속한 "=" 연산자 중 우변에 int형을 받는 것을 찾을 수 없다는 것이다.
만약 explicit 키워드를 써주지 않으면 제대로 컴파일 된다고 나올 것이다.
굳이 묵시적인 변환기능을 놔두고 명시적으로 explicit 키워드를 써주는 것일까?
대형 프로젝트에서 상당히 찾기 어려운 버그로 잠재되어 숨어있을 가능성이 높기 때문이다.
기본적이지만 꼭 알아두도록 하자.
반응형
'C & C++ 관련' 카테고리의 다른 글
1byte alignment 이야기 [struct 패딩에대한..] (1) | 2010.03.31 |
---|---|
How do I call a C++ function from C? (0) | 2010.03.22 |
extern "C" (0) | 2009.10.16 |