Heim > Backend-Entwicklung > C++ > Hauptteil

Warum funktioniert `std::cout

Mary-Kate Olsen
Freigeben: 2024-10-28 02:37:31
Original
982 Leute haben es durchsucht

Why does `std::cout

Seltsamer Fall von f; Warum wird in der Ausgabe immer 1 ausgegeben?

Das Auftreten eines eigenartigen Verhaltens, bei dem der Aufruf einer Funktion ohne Klammern (f;) und das Drucken ihres Ergebnisses mit std::cout durchweg die Zahl 1 ergibt, kann Fragen aufwerfen. Zunächst könnte man erwarten, dass der Code einen Funktionszeiger ausgibt, aber Beobachtungen deuten auf etwas anderes hin.

Wenn wir uns den Code unten ansehen:

<code class="cpp">#include <iostream>
using namespace std;

void pr()
{
    cout << "sth";
}

int main()
{
    pr;
    cout << pr;  // output: 1
    cout << *pr; // output: 1
    cout << &pr; // output: 1
}
Nach dem Login kopieren

Wir können sehen, dass pr; ruft die Funktion pr() technisch gesehen nicht auf. Stattdessen wird der Funktionszeiger an cout übergeben. Wenn der Funktionszeiger während dieses Vorgangs in einen Bool-Wert konvertiert wird, verhält er sich ähnlich wie ein logischer Ausdruck, bei dem ein Wert ungleich Null als wahr ausgewertet wird. Dies wird beim Drucken in 1 übersetzt.

Darüber hinaus gibt es im Standard vor C 11 keine Überladung, die das Streamen eines Funktionszeigers ermöglicht. Dies macht es schwierig, Funktionszeiger direkt mit std::cout zu formatieren und zu drucken. Mit dem Aufkommen von C 11 kann man jedoch eine benutzerdefinierte Überladung definieren, um dies zu erreichen:

<code class="cpp">template <class RType, class ... ArgTypes>
std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...))
{
    return s << "(func_ptr=" << (void*)func << ")(num_args="
             << sizeof...(ArgTypes) << ")";
}
Nach dem Login kopieren

Mit dieser Überladung wird cout << pr gibt nun Folgendes aus:

<code class="text">(func_ptr=<address of pr>)(num_args=0)</code>
Nach dem Login kopieren

Diese benutzerdefinierte Überladung demonstriert das Drucken von Funktionszeigern unterschiedlicher Stelligkeit. Das Problem mit Funktionszeigern wird zwar gemildert, Szenarios mit überladenen Funktionen oder Funktionsvorlagen, bei denen die Angabe der gewünschten Überladung unerlässlich ist, werden jedoch nicht vollständig gelöst.

Das obige ist der detaillierte Inhalt vonWarum funktioniert `std::cout. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!