반응형
explicit
묵시적 형변환을 할 수 없게 만들고 명시적인 형변환만 가능하도록 만드는 것이다.
즉, 자신이 원하지 않는 형변환이 일어나지 않도록 제한하는 키워드이다.
예제
#include <iostream>
using namespace std;
class User
{
private:
int m_UserSN;
public:
User(int UserSN) :m_UserSN{ UserSN } {};
int GetSN() { return m_UserSN; }
};
void PrintUser(User user) {
cout << user.GetSN() << endl;
}
int main()
{
int n = 30;
PrintUser(n);
}
PrintUser(User user) 함수의 인자로 들어오는 int n = 30 이라는 숫자가 User 형태로 바뀌게 됩니다.
이때 생성자 User(int UserSN)을 통해서 바뀌게 됩니다.
#include <iostream>
using namespace std;
class User
{
private:
int m_UserSN;
public:
explicit User(int UserSN) :m_UserSN{ UserSN } {};
int GetSN() { return m_UserSN; }
};
void PrintUser(User user) {
cout << user.GetSN() << endl;
}
int main()
{
int n = 30;
PrintUser(n); // Error
}
explicit 키워드를 사용함으로써 컴파일러가 알아서 형변환 하는 것을 막을 수 있습니다.
이처럼 explicit 키워드 없이 사용한다면 사용자가 원치 않은 형변환이 일어나는 등 예기치 않은 버그가 발생할 수 있기 때문에 사용해 주는 것이 좋습니다.
#include <iostream>
using namespace std;
class User
{
private:
int m_UserSN;
public:
explicit User(int UserSN) :m_UserSN{ UserSN } {};
int GetSN() { return m_UserSN; }
};
void PrintUser(User user) {
cout << user.GetSN() << endl;
}
int main()
{
int n = 30;
PrintUser(static_cast<User>(n));
}
explicit 키워드를 사용한다면 사용자가 상황에 맞게 직접 형변환을 해주어야 합니다.
반응형
'C, C++' 카테고리의 다른 글
[C#] delegate (대리자) (0) | 2022.10.11 |
---|---|
[C#] ThreadPool 클래스 (0) | 2022.07.04 |
[C/C++]스마트 포인터(smart pointer) (0) | 2021.11.22 |
[C/C++] accumulate 사용법과 주의사항 (0) | 2021.07.09 |
[C/C++] stringstream 사용법 (0) | 2021.07.03 |