struct A {
int x;
A(int x) : x(x) {}
operator int() const { return x; } // A를 int로 암시적으로 변환
};
→ struct A는 int형 변수 x를 선언하고 생성자로 초기화하며, 객체를 int로 암시적으로 변환할 수 있도록 operator int()를 정의한 구조체다.
클래스에 형 변환 함수를 정의할 수 있다.
예를 들어 operator int()는 객체를 int로 변환 가능하다.
struct A {
int x;
A(int x) : x(x) {}
operator int() const { return x; }
};
int main() {
A a(42);
int n = a; // 여기서 operator int()가 자동으로 호출됨 → n = 42
}
→ int n = a; 라고 했을 때 a는 A 타입인데, operator int() 가 정의돼 있어서 a가 int로 자동 변환
→ 즉 a.operator int()가 호출되어 x값(42)을 return
암시적 변환을 막는다.
생성자나 변환 연산자 앞에 붙이면, 명시적 형변환만 허용된다.
암시적 변환으로 인해 개발자가 의도하지 않은 방식으로 코드가 동작할 수 있기 때문에 explicit을 붙이면 암시적 변환을 막고, 명시적으로만 사용하게 제한할 수 있다.
암시적 변환
명시적 변환
| 표현 | 설명 | 변환 방식 |
|---|---|---|
int b = a; | A를 int로 자동 변환 | 암시적 |
int c = static_cast<int>(a); | 개발자가 직접 int로 변환 | 명시적 |
struct A {
int x;
A(int x) : x(x) {}
operator int() const { return x; }
};
int main() {
A a = 10; // 생성자 호출 (암시적)
int b = a; // 여기서 operator int() 자동 호출됨 (암시적 변환)
int c = static_cast<int>(a); // 명시적 변환
}
사용자 정의 타입을 숫자처럼 쓰거나, 더 편한 코드를 위해 필요하다.
int x = 5;
double y = x; // 여기서 암시적으로 int → double 변환됨
Fraction f(1, 2); // 분수 1/2
double d = f; // 암시적으로 double로 변환 (예: 0.5)
기본 타입 간에는 operator 없어도 암시적 형변환이 된다.
사용자 정의 타입에서는 operator가 있어야 형변환 된다.
struct A {
int x;
A(int x) : x(x) {}
// operator int() 없으면 ↓ 이건 안 됨
// int n = a;
};
| 경우 | operator 없어도 암시적 변환 가능? |
|---|---|
기본 타입끼리 (예: int → double) | ✅ 됨 |
| 사용자 정의 타입 → 기본 타입 | ❌ 안 됨 (operator 필요) |
| 기본 타입 → 사용자 정의 타입 | ✅ 생성자가 하나면 암시적 생성 가능 (explicit 없으면) |