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.5
A는 double
하는 수 없습니다 float
.