C++의 explicit 키워드는 뭘 하는 건가요?
조회수 31546회
제가 인터넷을 돌아다니다가
어떤 답변에서 밑에 C++ 코드를 봤는데
이 explicit
은 무슨 일을 해주는 건가요?
소스코드
class String {
public:
explicit String (int n); //allocate n bytes
String(const char *p); // initialize sobject with string p
};
2 답변
-
C++컴파일러는 함수의 인자로 들어오는 값을 알아서 타입에 맞게 바꿀 수 있습니다. 이게 무슨 뜻 인지는 다음의 예제로 설명할게요.
class Foo{ public: int m_foo; Foo (int foo) : m_foo (foo) {} }; void printM_foo (Foo foo){ cout << foo.m_foo << endl; } int main (){ int num = 43; printM_foo(num); }
결과:
43
printM_foo(Foo foo)
는Foo
타입의 파라미터foo
를 받아서foo.m_foo
를 출력합니다. 그런데main()
은 지금Foo
타입이 아닌int
타입 파라미터를 넘기고 있지요. 심지어는 출력도 잘 됩니다. 어떤 식으로 컴파일러가 일하길래 이런 결과가 나타날까요?printM_foo(num)
이 호출되면 컴파일러는Foo
클래스에서int
를 파라미터로 받는 생성자를 호출해printM_foo(Foo foo)
의 적절한 파라미터 타입인Foo
로 알아서 형 변환을 해줍니다.explicit
키워드는 이런 상황에서 사용합니다. 자동 형 변환을 의도하지 않은 사용법인 경우, 버그를 야기할 수도 있기 때문에explicit
키워드를 써서 컴파일러가 파라미터 형 변환을 위해 생성자를 호출하는 것을 막아 버그를 방지할 수 있습니다.따라서 위 코드의 생성자 앞에 다음과 같이
explicit
을 명시해 주면explicit Foo (int foo) : m_foo (foo) {}
printM_foo(num);
에서 컴파일러가 에러를 띄워주고 여기서부터는 파라미터 형 변환은 컴파일러가 아닌 프로그래머가 해줘야 합니다.class Foo{ public: int m_foo; explicit Foo (int foo) : m_foo (foo) {} }; void printM_foo (Foo foo){ cout << foo.m_foo << endl; } int main (){ int num = 43; printM_foo(num); // 에러 }
- 좋은 글 감사합니다. 에러를 고치려면 printM_foo(num)을 printM_foo(new Foo(num)); 로 변경하면 되겠군요? 알 수 없는 사용자 2018.11.2 14:23
-
void printM_Foo ( Foo foo ) 선언문에서 43을 인자로 받으면 Foo foo = 43 이 되고, Foo foo(43) 이 되면서 임시객체가 생성되는 것 아닌가여
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력