2010-12-13 88 views
1

La spécification explicite d'une méthode/d'un constructeur signifie-t-elle qu'elle ne peut pas être appelée implicitement? Je veux dire si un constructeur est spécifié comme explicite, ne peut-il pas être appelé implicitement par un opérateur comme = ou d'autres méthodes comme le constructeur de convertisseur?La spécification explicite d'une méthode/constructeur signifie-t-elle qu'elle ne peut pas être appelée implicitement?

Dans ce cas, spécifier une méthode/constructeur pour être explicite a-t-il une quelconque importance? Quels sont les avantages de spécifier une méthode/constructeur pour être explicite?

+0

Je pense que [MSDN] (http://msdn.microsoft.com/en-us/library/h1y7x448.aspx) peut répondre à cette question. Avez-vous essayé de google cela? Tout code produit pour l'essayer? – Default

+3

http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

Répondre

1
class MyClass 
{ 
    int i; 
    MyClass(YourClass &); 
}; 

class YourClass 
{ 
    int y; 

}; 

void doSomething(MyClass ref) 
{ 
    //Do something interesting over here 

} 

int main() 
{ 
    MyClass obj; 
    YourClass obj2; 

    doSomething(obj2); 
} 

Dans l'exemple depuis constructeur de MyClass n'est spécifié comme explicite, il est utilisé pour la conversion implicite tout en appelant la fonction doSomething(). Si le constructeur de MyClass est marqué comme explicite, alors le compilateur donnera une erreur au lieu de la conversion implicite en appelant la fonction doSomething(). Donc, si vous voulez éviter de telles conversions implicites, vous devez utiliser le mot clé explicit.

Pour ajouter à ce qui précède: mot-clé explicit peut être utilisé uniquement pour les constructeurs et non des fonctions. Bien qu'il puisse être utilisé pour des constructeurs avec plus de plus de paramètres, il n'y a pas d'utilisation pratique du mot-clé pour les constructeurs avec plus d'un paramètre, puisque le compilateur peut seulement utiliser un constructeur avec un paramètre pour les conversions implicites.

0

La fonction ne peut pas avoir de spécificateur explicite. Cela n'a pas de sens pour un fnc d'avoir un spécificateur explicite. Et comme pour ctor - la réponse à votre Q est oui. En déclarant que ctor est explicite, cela signifie qu'il est illégal de l'appeler implicitement.
Quand est-ce utile? Dans la situation où, par exemple votre classe:

class X 
{ 
X(char){/*something really cool*/} 
}; 

et plus tard dans le code que vous écrirait:

X _1 = 'a';//this line will call conv ctor 

Avec ligne comme ceci ci-dessus se produire très souvent que programmeur a eu quelque chose de différent à l'esprit et cette conversion est totalement involontaire.