La conversion de type implicite en C++ fait référence à la conversion automatique d'un compilateur du « type de paramètre constructeur » en « type de classe ». La conversion implicite de type de classe comporte des risques. La conversion implicite entraîne des variables temporaires de la classe, qui disparaissent une fois l'opération terminée. Nous avons construit un objet qui a été supprimé une fois le test terminé.
Conversion implicite de type de classe C++
Dans "C++ Primer" mentionné :
"Un constructeur qui peut être appelé avec un seul paramètre définit une conversion implicite du type de paramètre en type de classe."
Cela devrait l'être. Notez ici que "peut être appelé avec un seul paramètre formel" ne signifie pas que le constructeur ne peut avoir qu'un seul paramètre formel, mais qu'il peut avoir plusieurs paramètres formels, mais ces paramètres formels ont des paramètres réels par défaut.
Alors, qu'est-ce que la « conversion implicite » ? Comme mentionné dans la phrase ci-dessus, est la conversion automatique d'un compilateur du type de paramètre constructeur en type de classe.
Jetons un coup d'œil au code :
#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"); }
Comme vous pouvez le voir dans le code, la fonction isSameISBN attend un paramètre de type classe BOOK, mais nous avons passé un type de chaîne Give à lui, ce n'est pas ce qu'il veut ! Heureusement, il existe un constructeur dans la classe BOOK, qui est appelé avec un paramètre réel de type chaîne. Le compilateur appelle ce constructeur, convertit implicitement le type chaîne en type BOOK (construit un objet temporaire BOOK), puis le transmet. Fonction isSameISBN.
La conversion implicite de type de classe comporte toujours des risques. Comme indiqué ci-dessus, la conversion implicite obtient des variables temporaires de la classe et disparaît une fois l'opération terminée. Nous avons construit un objet qui a été supprimé une fois le test terminé.
Nous pouvons supprimer cette conversion via une déclaration explicite :
explicit BOOK(string ISBN,float price=0.0f):_bookISBN(ISBN),_price(price){}
Le mot-clé explicite ne peut être utilisé que pour les déclarations de constructeur à l'intérieur de la classe. De cette façon, le constructeur de la classe BOOK ne peut pas être utilisé depuis l'objet. est créé implicitement, lors de la compilation du code ci-dessus, l'invite suivante apparaîtra :
Désormais, l'utilisateur ne peut effectuer qu'une conversion de type d'affichage et créer explicitement des objets temporaires.
Pour résumer :
peut être appelé avec un seul paramètre réel, ce qui ne signifie pas que le constructeur ne peut avoir qu'un seul paramètre formel.
La conversion de type de classe implicite est facile à provoquer des erreurs. Sauf si vous avez une raison claire d'utiliser la conversion de type de classe implicite, sinon, déclarez tous les constructeurs qui peuvent être appelés avec un argument comme explicites.
explicit ne peut être utilisé que pour déclarer des constructeurs à l'intérieur d'une classe. Bien que cela puisse éviter les problèmes causés par la conversion de type implicite, cela nécessite que l'utilisateur crée explicitement des objets temporaires (ce qui impose des exigences à l'utilisateur).
Recommandé : "Tutoriel C++"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!