C++ explicit 이란?
잡설
회사 코드를 뒤적거리다 explicit 키워드를 봤을때 학부때 명시적 선언이라고 배웠던 기억을 겨우 꺼냈습니다. 다만 중요하게 여기지 않았던 기억이 있어, 그대로 지나치며 한번 정리하자고 생각해두었습니다. 그렇게 기억의 한 구석에 치워두고 확인해볼 생각조차 하지 못했는데, 다시 그 코드를 보았을때 이번에는 정확하게 무엇인지 정리해두어야겠다고하여 이제 정리해둡니다.
explicit이 나온 이유?
explicit으로 검색했을때 가장 먼저 나온 이야기는 cpp 컴파일러가 자동으로 형변환을 한다는 것입니다.
#include <iostream>
#include <string>
class Test
{
private:
int _val;
public:
Test(int val) : _val(val) {}
std::string to_string() { return std::to_string(_val); }
};
void print(Test test) {
std::cout << test.to_string() << std::endl;
}
int main(int argc, char* argv[])
{
int val = 1024;
print(val);
return 0;
}
컴파일 및 실행
$ g++ -std=c++11 explicit.cpp
$ a.out
1024
됩니다! print 함수는 분명히 Test를 받도록 되어있는데 int val을 넘겨줘도 됩니다!
...
네 몰랐습니다. 경력으로 딱지쳤나봅니다.
explicit
여기서는 Test 클래스가 별달리 하는 일이 없지만, 만약 여러가지 일을 한다면 문제가 될 것입니다. 그래서 이런 경우를 방지하기 위해 명시적으로 생성자에 explicit 키워드를 붙여주면 컴파일 과장에서 에러가 발생합니다.
class Test
{
private:
int _val;
public:
explicit Test(int val) : _val(val) {}
std::string to_string() { return std::to_string(_val); }
};
컴파일
$ g++ -std=c++11 explicit.cpp
explicit.cpp: In function ‘int main(int, char**)’:
explicit.cpp:21:14: error: could not convert ‘val’ from ‘int’ to ‘Test’
print(val);
추가 정보
cplusplus.com의 explicit 항목에서 자세한 내용을 확인할 수 있습니다. class 생성자와 (c++11부터) 변환함수(타입을 바꿀수 있는 operator 함수)에 사용할수 있습니다. 즉 그 외에는 사용할 수 없다는 뜻입니다. explicit의 의미를 정확하게 이해했다면, 다른데 사용할 생각조차 안들겠죠.
댓글
댓글 쓰기