Konversi tipe implisit konstruktor C ++ [duplikat]
Nov 14 2020
Mari kita asumsikan bahwa saya memiliki kode ini:
class A {
public:
A(int y) { cout << y; }
};
int main() {
A a(1.5);
return 0;
}
Meskipun 1.5 adalah a float, kode ini berfungsi dan mengembalikan 1. Secara floatimplisit di-cast int. Mengapa tidak ada pengecualian? Apakah konstruktor bergantung pada jumlah parameter atau tipenya? Di mana saya bisa membaca tentang ini?
Jawaban
5 songyuanyao Nov 14 2020 at 16:03
Karena konversi implisit semacam itu (dari doubleke int) diperbolehkan.
Mengambang - konversi integral
- Prvalue tipe floating-point dapat dikonversi menjadi prvalue tipe integer apa pun. Bagian pecahan terpotong, yaitu bagian pecahan dibuang. Jika nilai tidak bisa masuk ke dalam tipe tujuan, perilakunya tidak terdefinisi (bahkan ketika tipe tujuan tidak bertanda tangan, aritmatika modulo tidak berlaku).
Jika Anda tidak ingin konstruksi seperti itu terjadi, Anda dapat menambahkan pengambilan konstruktor doubledan menandainya sebagai delete. Misalnya
class A {
public:
A(double) = delete;
A(int y) { cout << y; }
};
BTW: 1.5adalah a double, bukan a float.
Selalu Menjadi Ancaman: Mengapa Orang Berkulit Coklat dan Hitam Tidak Bisa Nyaman di Amerika Serikat
Taylor Sheridan Baru Menambahkan 1 Bintang 'Yellowstone' Favoritnya ke Pemeran 'Lawmen: Bass Reeves'