Heim > Backend-Entwicklung > C++ > Hauptteil

Warum wird „Hello World' in einer überlasteten C-Druckmethode als „True' gedruckt?

Linda Hamilton
Freigeben: 2024-11-14 11:05:02
Original
185 Leute haben es durchsucht

Why Does

String-Literal-Mehrdeutigkeit in überladenen Methoden

In C ist es beim Überladen von Methoden, die mehrere Typen akzeptieren, wichtig, sich möglicher Mehrdeutigkeiten bewusst zu sein. Wie unten dargestellt:

<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>
Nach dem Login kopieren

Wenn wir versuchen, die Print-Methode mit einem String-Literal wie folgt aufzurufen:

<code class="cpp">Output::Print("Hello World");</code>
Nach dem Login kopieren

Unerwarteterweise ist die Ausgabe „True“ statt „Hello World“. ". Warum?

String-Literale vs. benutzerdefinierte Konvertierungen

In C sind String-Literale wie „Hello World“ nicht vom Typ std::string, sondern ein Array konstanter Zeichen. Sie können jedoch implizit in einen Bool-Wert konvertiert werden. Diese Konvertierung, bekannt als Standardkonvertierungssequenz, wird vom Compiler dem benutzerdefinierten Konvertierungskonstruktor für std::string vorgezogen.

Überlastungsauflösung und Standardkonvertierungen

Während der Überladungsauflösung bestimmt der Compiler die beste aufzurufende Funktion für jedes Argument. Standardkonvertierungssequenzen werden gegenüber benutzerdefinierten Konvertierungen bevorzugt. In unserem Fall gilt die Standardkonvertierung von „Hello World“ in bool als besser als die benutzerdefinierte Konvertierung in std::string.

So vermeiden Sie Mehrdeutigkeiten

Um sicherzustellen, dass der std Wenn eine ::string-Überladung verwendet wird, müssen wir explizit ein std::string-Argument übergeben:

<code class="cpp">Output::Print(std::string("Hello World"));</code>
Nach dem Login kopieren

Dies löst die Mehrdeutigkeit auf und gibt „Hello World“ korrekt aus.

Schlussfolgerung

Das Verständnis impliziter Konvertierungen und ihrer Auswirkungen auf die Überlastungsauflösung ist in C von entscheidender Bedeutung. Standardmäßig haben Standardkonvertierungen Vorrang vor benutzerdefinierten Konvertierungen. Daher ist es wichtig, sich solcher Konvertierungen bewusst zu sein und bei Bedarf explizite Typkonvertierungen vorzunehmen, um unerwartetes Verhalten zu vermeiden.

Das obige ist der detaillierte Inhalt vonWarum wird „Hello World' in einer überlasteten C-Druckmethode als „True' gedruckt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage