2013-01-19 2 views
-3

Possible en double:
What does the explicit keyword in C++ mean?"Explicite" empêchant la conversion automatique de type?

Je ne comprends pas ce qui suit. Si j'ai:

class Stack{ 
    explicit Stack(int size); 
} 

sans le mot-clé explicit je serais autorisé à le faire:

Stack s; 
s = 40; 

Pourquoi devrais-je être autorisé à faire ce qui précède si explicite n'a pas été fourni ?? Est-ce parce qu'il s'agit d'une allocation de pile (pas de constructeur) et que C++ permet d'attribuer quelque chose à la variable à moins que explicit soit utilisé?

+1

Utilisez votre recherche: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c- signifie – dans3itz

+0

Je ne demandais pas ce que signifie explicitement, je demandais pourquoi est-il possible que s peut être affecté à 40 ... – user997112

Répondre

5

Cette ligne

s = 40; 

est équivalent à

s.operator = (40); 

qui tente de faire correspondre la valeur par défaut operator = (const Stack &). Si le constructeur Stack n'est pas explicite, la conversion suivante est essayée et réussit:

s.operator = (Stack(40)); 

Si le constructeur est explicit cette conversion n'est pas jugée et la résolution de surcharge échoue.

+0

Quel est le problème avec s.operator = (Stack (40)); ? N'est-ce pas légal et nous voulons juste empêcher l'attribution du numéro 40? – user997112

+0

@ user997112: 's.operator = (Stack (40))' est légal, mais c'est un appel * explicite * au constructeur. Le fait est que cette version n'est pas essayée si le constructeur est dit «explicite». – ybungalobill

1

hey c'est assez simple. le mot clé explicite ne s'arrête plus à la conversion automatique de tout type de données à celui défini par l'utilisateur. Il est généralement utilisé avec un constructeur ayant un seul argument. dans ce cas u sont jus d'arrêt du complier de conversion explicite

#include iostream 
using namespace std; 
class A 
{ 
    private: 
    int x; 
    public: 
    A(int a):x(a) 
     {} 
} 
int main() 
{ 
A b=10; // this syntax can work and it will automatically add this 10 inside the 
      // constructor 
return 0; 
} 
but here 

class A 
{ 
    private: 
    int x; 
    public: 
    explicit A(int a):x(a) 
     {} 
} 
int main() 
{ 
A b=10; // this syntax will not work here and a syntax error 
return 0; 
} 
Questions connexes