[cpp] operator - explicit

minjubyeon·2025년 5월 20일

cpp

목록 보기
13/26
struct A {
	int x;
	A(int x) : x(x) {}
	operator int() const { return x; } // A를 int로 암시적으로 변환
};

→ struct A는 int형 변수 x를 선언하고 생성자로 초기화하며, 객체를 int로 암시적으로 변환할 수 있도록 operator int()를 정의한 구조체다.

1. operator

클래스에 형 변환 함수를 정의할 수 있다.
예를 들어 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

  • 암시적 사용: int n = a; 또는 cout << a;
  • 명시적 사용: int n = static_cast(a);

2. explicit

암시적 변환을 막는다.
생성자나 변환 연산자 앞에 붙이면, 명시적 형변환만 허용된다.

암시적 변환으로 인해 개발자가 의도하지 않은 방식으로 코드가 동작할 수 있기 때문에 explicit을 붙이면 암시적 변환을 막고, 명시적으로만 사용하게 제한할 수 있다.

  • explicit 생성자: 객체 생성 시 암시적 변환을 막음
  • explicit operator: 객체에서 다른 타입으로 암시적 변환을 막음

⚠️ 차이점 (암시적 vs 묵시적)

암시적 변환

  • 컴파일러가 자동으로 형 변환을 해줌
  • 편하지만 위험할 수도 있음

명시적 변환

  • 프로그래머가 직접 static_cast 등을 써야 함
  • 더 안전함

표현설명변환 방식
int b = a;Aint로 자동 변환암시적
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 없어도 암시적 형변환이 된다.
사용자 정의 타입에서는 operator가 있어야 형변환 된다.

struct A {
  int x;
  A(int x) : x(x) {}
  // operator int() 없으면 ↓ 이건 안 됨
  // int n = a;
};

경우operator 없어도 암시적 변환 가능?
기본 타입끼리 (예: int → double)✅ 됨
사용자 정의 타입 → 기본 타입❌ 안 됨 (operator 필요)
기본 타입 → 사용자 정의 타입✅ 생성자가 하나면 암시적 생성 가능 (explicit 없으면)


profile
안녕하세요.

0개의 댓글