[2026] C++ Type Conversion | Implicit, Explicit, and User-Defined

[2026] C++ Type Conversion | Implicit, Explicit, and User-Defined

이 글의 핵심

How C++ converts types: implicit promotions, static_cast, conversion constructors and operators, explicit, and the one user-defined conversion limit—with practical examples.

Implicit conversions

The compiler applies standard conversions automatically when safe or allowed: 아래 코드는 cpp를 사용한 구현 예제입니다. 코드를 직접 실행해보면서 동작을 확인해보세요.

int x = 10;
double y = x;  // int -> double
float f = 3.14f;
int z = f;       // float -> int (truncates)
bool b = 42;     // int -> bool (nonzero -> true)

Explicit casts

double d = 3.14;
int x = (int)d;              // C-style
int y = static_cast<int>(d); // preferred in C++

Conversion constructors

다음은 cpp를 활용한 상세한 구현 코드입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.

class Distance {
    double meters;
public:
    Distance(double m) : meters(m) {}
    double getMeters() const { return meters; }
};
void printDistance(Distance d) {
    std::cout << d.getMeters() << "m\n";
}
int main() {
    printDistance(100.5);           // implicit double -> Distance
    printDistance(Distance(50.0)); // explicit
}

explicit constructors

아래 코드는 cpp를 사용한 구현 예제입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며, 에러 처리를 통해 안정성을 확보합니다. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.

class Distance {
    double meters;
public:
    explicit Distance(double m) : meters(m) {}
    double getMeters() const { return meters; }
};
void printDistance(Distance d) {}
int main() {
    // printDistance(100.5);  // error
    printDistance(Distance(100.5)); // OK
}

Conversion operators

아래 코드는 cpp를 사용한 구현 예제입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.

class Distance {
    double meters;
public:
    Distance(double m) : meters(m) {}
    operator double() const { return meters; }
};
int main() {
    Distance d(100.5);
    double x = d;  // implicit Distance -> double
}

Practical examples

String wrapper

아래 코드는 cpp를 사용한 구현 예제입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며. 코드를 직접 실행해보면서 동작을 확인해보세요.

class String {
    std::string data;
public:
    String(const char* str) : data(str) {}
    explicit String(const std::string& str) : data(str) {}
    operator std::string() const { return data; }
    operator const char*() const { return data.c_str(); }
};

Smart pointer–style explicit operator bool

아래 코드는 cpp를 사용한 구현 예제입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.

template<typename T>
class SmartPtr {
    T* ptr;
public:
    explicit SmartPtr(T* p = nullptr) : ptr(p) {}
    ~SmartPtr() { delete ptr; }
    explicit operator bool() const { return ptr != nullptr; }
    T& operator*() const { return *ptr; }
    T* operator->() const { return ptr; }
};

Temperature types

Use explicit ctors and named conversions to avoid accidental unit mixing.

Fraction with explicit conversion operators

아래 코드는 cpp를 사용한 구현 예제입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며. 각 부분의 역할을 이해하면서 코드를 살펴보시기 바랍니다.

class Fraction {
    int numerator, denominator;
public:
    Fraction(int n, int d = 1) : numerator(n), denominator(d) {}
    explicit operator double() const {
        return static_cast<double>(numerator) / denominator;
    }
};
int main() {
    Fraction f(3, 4);
    double d = static_cast<double>(f);
}

Standard conversion sequence (sketch)

Integer promotion, integral/floating conversions, pointer conversions, boolean conversion—see the standard for the full ordering.

User-defined conversion limits

아래 코드는 cpp를 사용한 구현 예제입니다. 클래스를 정의하여 데이터와 기능을 캡슐화하며, 에러 처리를 통해 안정성을 확보합니다. 코드를 직접 실행해보면서 동작을 확인해보세요.

class A { public: A(int) {} };
class B { public: B(const A&) {} };
int main() {
    // B b = 42;  // error: needs int->A and A->B (too many user conversions)
    A a = 42;
    B b = a;
}

At most one user-defined conversion in an implicit sequence (with exceptions for explicit paths).

Common problems

Accidental Array from size_t

Mark single-arg ctors explicit to avoid func(10) creating an Array unintentionally.

Implicit conversion operators

Prefer explicit operator T() when implicit conversion causes surprises.

explicit(bool) (C++20)

Conditional explicit on templates—for converting constructors that should only be implicit when safe.

FAQ

Q: When use explicit?
A: Single-argument ctors and conversion operators that should not participate in silent conversions. Q: Conversion ctor vs conversion operator?
A: Ctor: other type → this type. Operator: this type → other type. Q: C vs C++ casts?
A: Prefer static_cast, const_cast, reinterpret_cast, dynamic_cast—each shows intent. Resources: Effective C++, C++ Primer, cppreference.

Keywords

C++, type conversion, implicit conversion, explicit, static_cast, conversion operator.

... 996 lines not shown ... Token usage: 63706/1000000; 936294 remaining Start-Sleep -Seconds 3