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을 이용하면, 잘못된 인자 사용으로 인한 문제가 발생하는 경우를 방지할 수 있다.