explicit
C++ 컴파일러가 암시적으로 형변환을 일으키지 않도록 하는 키워드
암시적 변환이란?
- 암시적 변환(implicit conversion)을 예제를 통해 알아보자
#include <iostream> #include <string> using namespace std; class MyString { char* strings; int strLen; public: void printstr(); // 문자열 생성 MyString(const char* str); // 복사 생성자 MyString(const MyString& str); ~MyString(); }; MyString::MyString(const char* str) { strLen = strlen(str); strings = new char[strLen]; for (int i = 0; i != strLen; i++) { strings[i] = str[i]; } } MyString::MyString(const MyString& str) { strLen = str.strLen; strings = new char[strLen]; for (int i = 0; i != strLen; i++) { strings[i] = str.strings[i]; } } MyString::~MyString() { cout << "객체가 소멸되었습니다. " << endl; delete[] strings; } void MyString::printstr() { for (int i = 0; i < strLen; i++) { cout << strings[i]; } cout << endl; } void printstr(MyString s) { s.printstr(); } int main() { printstr(MyString("mystrings")); printstr("mystrigns"); // 암시적 변환 -> MyString("mystrings")와 동일 return 0; }
mystrings 객체가 소멸되었습니다. mystrigns 객체가 소멸되었습니다.
- 위 예제는 문자열을 출력하는 코드이며, printstr 함수는 인자로 MyString 객체를 전달받는다.
- main 함수에서 MyString 타입임을 명시하지 않았음에도 C++ 컴파일러는 "mystrings"를 MyString("mystrings")로 변환하여 객체를 생성하였다.
- 위와 같은 암시적 변환을 통해 코드를 편하게 작성할 수 있지만, 어떤 경우에서는 명시하지 않음으로써 치명적인 오류가 일어날 수도 있다.
explicit 키워드
- explicit ▶ 명시적
- explicit 키워드를 이용하여 컴파일러에게 암시적 변환을 사용할 수 없도록 알려줄 수 있다.
- 단순하게 함수 앞에 explicit 키워드를 적으면 된다.
explicit MyString(const char* str);

- 이전과 달리, 명확하게 인자의 타입을 적어주지 않으면 오류가 발생한다.
- explicit을 이용하면, 잘못된 인자 사용으로 인한 문제가 발생하는 경우를 방지할 수 있다.