반응형
explicit 키워드 정리
1. explicit
키워드는 C++에서 암시적(implicit) 형변환을 막기 위한 키워드
2. 주로 생성자(constructor)나 변환 생성자(converting constructor)에 사용되어, 의도하지 않은 자동 형 변환을 방지함
✅ 기본 문법
class MyClass {
public:
explicit MyClass(int value); // explicit 생성자
};
✅ 왜 쓰는가? (자동 형변환 방지)
예시 1: 암시적 변환이 허용되는 경우 (explicit 없음)
class MyClass {
public:
MyClass(int value) {} // 암시적 변환 허용
};
void doSomething(MyClass obj) {}
doSomething(10); // int → MyClass 로 자동 변환되어 OK
예시 2: explicit
로 암시적 변환 금지
class MyClass {
public:
explicit MyClass(int value) {}
};
doSomething(10); // ❌ 컴파일 에러!
doSomething(MyClass(10)); // ✅ 명시적 변환은 OK
✅ 언제 사용해야 하는가?
상황 | explicit 사용 권장 여부 |
---|---|
생성자에 1개의 매개변수만 있을 때 | ✅ 거의 무조건 사용 |
타입 변환을 명시적으로만 허용하고 싶을 때 | ✅ 사용 |
오버로딩된 생성자 중 일부만 암시적 허용 | 🔁 선택적 사용 |
STL 컨테이너 등에서 잘못된 암시적 변환이 우려될 때 | ✅ 방지용으로 사용 |
✅ 주의: C++11 이후 explicit
은 operator
에도 사용 가능
class MyClass {
public:
explicit operator bool() const { return true; }
};
MyClass obj;
if (obj) { /* OK */ } // ✅ 명시적 bool 변환 허용
bool flag = obj; // ❌ 암시적 변환은 금지됨
🔍 if (obj)는 왜 허용될까?
class MyClass {
public:
explicit operator bool() const { return true; }
};
MyClass obj;
if (obj) { ... } // ✅ OK
- explicit operator bool()은 암시적 변환을 금지하지만,
if (obj) 또는 while (obj) 같은 조건식 안에서만 예외적으로 허용 - 이는 **C++ 표준에서 특별히 인정한 "컨텍스트 기반 암시적 변환"**
✅ 정리
구문 허용 여부 설명
if (obj) | ✅ 허용됨 | C++에서 bool 컨텍스트일 경우 명시적 변환자 허용 |
bool b = obj; | ❌ 에러 | 일반 대입에서는 explicit 변환자 작동 안 함 |
bool b = static_cast<bool>(obj); | ✅ 허용됨 | 명시적 변환 |
📌 결론
if (obj)는 문법상 명시적 호출은 아니지만,
explicit operator bool()에 대해 허용된 특별한 암시적 변환 컨텍스트
따라서 일반적으로 말하는 암시적 변환은 금지되지만,
if, while, for, switch 조건에서는 예외적으로 허용
✅ 결론 요약
항목 | 설명 |
---|---|
목적 | 암시적 형 변환 방지 |
사용 위치 | 생성자 / 변환 연산자 |
주로 쓰는 경우 | 단일 매개변수 생성자, operator bool() |
명시적 생성자 호출은 가능? | ✅ MyClass(10) 같이 직접 호출은 허용 |
반응형
'언어 > C, CPP' 카테고리의 다른 글
RAII(Resource Acquisition Is Initialization) (0) | 2025.06.16 |
---|---|
[c++] 생성자 선언 (0) | 2025.06.14 |
Interface vs concept (1) | 2025.06.04 |
[c++] concept (0) | 2025.06.03 |
메모리 누수 (0) | 2025.06.02 |
댓글