C ++ 생성자 암시 적 형식 변환 [중복]

Nov 14 2020

이 코드가 있다고 가정 해 보겠습니다.

class A {
public:
    A(int y) { cout << y; }
};

int main() {
    A a(1.5);

    return 0;
}

1.5가 a float이지만이 코드는 작동하고 1을 반환합니다. float은 암시 적으로 int. 예외가 발생하지 않은 이유는 무엇입니까? 생성자는 매개 변수의 양이나 유형에 따라 달라 집니까? 이에 대해 어디서 읽을 수 있습니까?

답변

5 songyuanyao Nov 14 2020 at 16:03

이러한 암시 적 변환 (에서 double으로 int)이 허용되기 때문입니다.

부동 적분 변환

  • 부동 소수점 유형의 prvalue는 모든 정수 유형의 prvalue로 변환 될 수 있습니다. 소수 부분이 잘립니다. 즉, 소수 부분이 삭제됩니다. 값이 대상 유형에 맞지 않으면 동작이 정의되지 않습니다 (대상 유형이 부호없는 경우에도 모듈로 산술이 적용되지 않음).

당신은 그런 구조가 발생하지 않으려면, 당신은 생성자 복용을 추가 할 수 있습니다 double및로 표시 delete. 예

class A {
public:
    A(double) = delete;
    A(int y) { cout << y; }
};

BTW : 1.5A는 double하는 수 없습니다 float.