Heim >Backend-Entwicklung >C#.Net-Tutorial >Was ist die implizite Typkonvertierung in C++?
Implizite Typkonvertierung in C++ bezieht sich auf die automatische Konvertierung eines Compilers vom „Konstruktorparametertyp“ in den „Klassentyp“. Die implizite Klassentypkonvertierung birgt Risiken, die zu temporären Variablen der Klasse führen, die nach Abschluss der Operation verschwinden. Wir haben ein Objekt erstellt, das nach Abschluss des Tests verworfen wurde.
Implizite C++-Klassentypkonvertierung
In „C++ Primer“ erwähnt :
„Ein Konstruktor, der mit einem einzelnen Parameter aufgerufen werden kann, definiert eine implizite Konvertierung vom Parametertyp zum Klassentyp.“
Sollte es sein Beachten Sie hier, dass „kann mit einem einzigen formalen Parameter aufgerufen werden“ nicht bedeutet, dass der Konstruktor nur einen formalen Parameter haben kann, sondern dass er mehrere formale Parameter haben kann, diese formalen Parameter jedoch standardmäßige tatsächliche Parameter haben.
Was ist also „implizite Konvertierung“? Wie im obigen Satz erwähnt, ist die automatische Konvertierung eines Compilers vom Konstruktorparametertyp in den Klassentyp.
Schauen wir uns den Code an:
#include "stdafx.h" #include <string> #include <iostream> using namespace std ; class BOOK //定义了一个书类 { private: string _bookISBN ; //书的ISBN号 float _price ; //书的价格 public: //定义了一个成员函数,这个函数即是那个“期待一个实参为类类型的函数” //这个函数用于比较两本书的ISBN号是否相同 bool isSameISBN(const BOOK & other ){ return other._bookISBN==_bookISBN; } //类的构造函数,即那个“能够用一个参数进行调用的构造函数”(虽然它有两个形参,但其中一个有默认实参,只用一个参数也能进行调用) BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){} }; int main() { BOOK A("A-A-A"); BOOK B("B-B-B"); cout<<A.isSameISBN(B)<<endl; //正经地进行比较,无需发生转换 cout<<A.isSameISBN(string("A-A-A"))<<endl; //此处即发生一个隐式转换:string类型-->BOOK类型,借助BOOK的构造函数进行转换,以满足isSameISBN函数的参数期待。 cout<<A.isSameISBN(BOOK("A-A-A"))<<endl; //显式创建临时对象,也即是编译器干的事情。 system("pause"); }
Wie Sie im Code sehen können, erwartet die Funktion isSameISBN einen BOOK-Klassentypparameter, wir haben jedoch einen Stringtyp Give übergeben es dazu, das ist nicht, was es will! Glücklicherweise gibt es in der BOOK-Klasse einen Konstruktor, der mit einem String-Typ-Aktualparameter aufgerufen wird. Der Compiler ruft diesen Konstruktor auf, konvertiert den String-Typ implizit in den BOOK-Typ (erstellt ein temporäres BOOK-Objekt) und übergibt ihn dann isSameISBN-Funktion.
Implizite Klassentypkonvertierung birgt immer noch Risiken. Wie oben erwähnt, erhält die implizite Konvertierung temporäre Variablen der Klasse und verschwindet nach Abschluss des Vorgangs. Wir haben ein Objekt erstellt, das nach Abschluss des Tests verworfen wurde.
Wir können diese Konvertierung durch explizite Deklaration unterdrücken:
explicit BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}
Das explizite Schlüsselwort kann nur für Konstruktordeklarationen innerhalb der Klasse verwendet werden. Auf diese Weise kann der BOOK-Klassenkonstruktor nicht verwendet werden Da das Objekt Wird implizit erstellt, erscheint beim Kompilieren des obigen Codes die folgende Eingabeaufforderung:
Jetzt kann der Benutzer nur noch eine Anzeigetypkonvertierung durchführen und explizit temporäre Objekte erstellen.
Zusammenfassend:
kann mit einem tatsächlichen Parameter aufgerufen werden, was nicht bedeutet, dass der Konstruktor nur einen formalen Parameter haben kann.
Die implizite Klassentypkonvertierung kann leicht zu Fehlern führen, es sei denn, Sie haben einen klaren Grund für die Verwendung der impliziten Klassentypkonvertierung. Andernfalls deklarieren Sie alle Konstruktoren, die mit einem Argument aufgerufen werden können, als explizit.
explicit kann nur zum Deklarieren von Konstruktoren innerhalb einer Klasse verwendet werden. Obwohl die durch die implizite Typkonvertierung verursachten Probleme vermieden werden können, muss der Benutzer explizit temporäre Objekte erstellen (was Anforderungen an den Benutzer stellt).
Empfohlen: „C++-Tutorial“
Das obige ist der detaillierte Inhalt vonWas ist die implizite Typkonvertierung in C++?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!