Rumah > pembangunan bahagian belakang > C++ > Mengapakah \'Hello World\' Mencetak sebagai \'Benar\' dalam Kaedah Cetakan C Terlebih Beban?

Mengapakah \'Hello World\' Mencetak sebagai \'Benar\' dalam Kaedah Cetakan C Terlebih Beban?

Linda Hamilton
Lepaskan: 2024-11-14 11:05:02
asal
253 orang telah melayarinya

Why Does

String Literal Ambiguity dalam Kaedah Terlebih Beban

Dalam C , apabila terlebih muatan kaedah yang menerima berbilang jenis, adalah penting untuk mengetahui potensi kekaburan. Seperti yang digambarkan di bawah:

<code class="cpp">class Output
{
public:
    static void Print(bool value)
    {
        std::cout << (value ? "True" : "False");
    }

    static void Print(std::string value)
    {
        std::cout << value;
    }
};</code>
Salin selepas log masuk

Jika kita cuba memanggil kaedah Cetak dengan rentetan literal seperti berikut:

<code class="cpp">Output::Print("Hello World");</code>
Salin selepas log masuk

Tanpa diduga, outputnya adalah "Benar" dan bukannya "Hello World ". Mengapa?

String Literals vs. User-Defined Conversions

Dalam C , rentetan literal seperti "Hello World" bukan jenis std::string tetapi lebih kepada susunan aksara tetap. Walau bagaimanapun, ia boleh ditukar secara tersirat kepada nilai bool. Penukaran ini, yang dikenali sebagai jujukan penukaran standard, diutamakan oleh pengkompil berbanding pembina penukaran yang ditentukan pengguna untuk std::string.

Resolusi Lebihan dan Penukaran Standard

Semasa resolusi beban lampau, pengkompil menentukan fungsi terbaik untuk memanggil setiap hujah. Keutamaan diberikan kepada jujukan penukaran standard berbanding penukaran yang ditentukan pengguna. Dalam kes kami, penukaran standard daripada "Hello World" kepada bool dianggap lebih baik daripada penukaran yang ditentukan pengguna kepada std::string.

Cara Mengelakkan Kekaburan

Untuk memastikan bahawa std :: string overload digunakan, kita perlu secara eksplisit lulus argumen std::string:

<code class="cpp">Output::Print(std::string("Hello World"));</code>
Salin selepas log masuk

Ini menyelesaikan kekaburan dan mengeluarkan "Hello World" dengan betul.

Kesimpulan

Memahami penukaran tersirat dan kesannya terhadap penyelesaian beban lampau adalah penting dalam C . Secara lalai, penukaran standard diutamakan daripada penukaran yang ditentukan pengguna. Oleh itu, adalah penting untuk mengetahui penukaran sedemikian dan membuat penukaran jenis eksplisit apabila perlu untuk mengelakkan tingkah laku yang tidak dijangka.

Atas ialah kandungan terperinci Mengapakah \'Hello World\' Mencetak sebagai \'Benar\' dalam Kaedah Cetakan C Terlebih Beban?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan