2017-10-02 1 views
1

J'ai un constructeurPourquoi le constructeur fonctionne-t-il avec de mauvais paramètres?

T(someClass<double> o); 

La classe someClass est initialisé par double* x. C'est

someClass<double>(double * X); 

Pourquoi les opérations suivantes fonctionnent-elles?

double * X=new X[10]; 
T obj(X); 

Pourquoi ce travail, même si qu'il n'y a pas de constructeur pour T, qui prend double * comme argument (il devrait obtenir une instance de someClass)? Est-ce que le compilateur initialise implicitement someClass, de double*?

Répondre

5

someClass<double>(double * X); pourrait être considéré comme converting constructor, ce qui pourrait convertir double* à someClass<double> implicitement.

Pour T obj(X);, le compilateur vérifie tous les constructeurs possibles de T pour construire obj; et pourrait trouver une voie possible qui convertit implicitement X en someClass<double> et l'utiliser comme argument pour T(someClass<double> o).

Vous pouvez interdire la conversion implicite non voulue en créant le constructeur explicit.

+0

Merci beaucoup. Ca me rendait fou, et je ne trouvais rien sur google (comme je ne connaissais pas le terme convertisseur constructeur) ... Quand le minuteur le permettra, j'accepterai cette réponse. – LeastSquaresWonderer

+3

Si vous ne voulez pas que votre constructeur soit utilisé pour des conversions implicites, déclarez-le avec 'explicit'. – melpomene