본문 바로가기
언어/C, CPP

[c++] explicit 키워드

by minhyeok.lee 2025. 6. 13.
반응형

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 이후 explicitoperator에도 사용 가능

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

댓글