2017-10-20 56 views
-1

Lors de l'appel du constructeur avec un argument constructeur par défaut, aucun objet n'est construit.Le constructeur de copie et de base n'initialise pas C++

class cl{ 
private: 
public: 
    cl(){cout << "Default used" << endl;}; 
    cl(const cl & cl_object) {cout << "Copy used" << endl;}; 
    cl & operator=(const cl & cl_object){cout << "Assignment used" << endl; return *this;}; 
}; 

Quand j'écris:

cl(cl()); 

aucun message s'affiche.

Questions: 1) Pourquoi aucun objet n'est construit? 2) Pourquoi le constructeur de copie n'est pas utilisé?

+0

@NathanOliver Pouvez-vous expliquer comment il s'agit d'un doublon? – Nameless

+0

Comme la réponse dit, 'cl (cl());' déclare une fonction. Puisque c'est une fonction et non une variable, vous ne verrez aucun appel de constructeur puisque vous ne construisez rien. – NathanOliver

+0

@NathanOliver Donc si je le comprends correctement en utilisant cl(); ne construit qu'un objet mais en utilisant cl (cl()); déclare une fonction. Mais s'il déclare une fonction, le compilateur ne devrait-il pas générer une erreur puisque je n'ai pas spécifié le type de retour? – Nameless

Répondre

1

analyse syntaxique le plus contrariant

cl(cl()); 

est analysé comme déclaration de fonction.

+0

Le compilateur ne devrait-il pas générer une erreur puisque je n'ai pas spécifié le type de retour? – Nameless

+0

Ma compréhension est que c'est une fonction appelée cl avec l'argument de type classe cl. Mais il n'a toujours pas de type de retour. Dans mon compilateur, si je ne spécifie pas le type de retour, il renvoie une erreur. Alors qu'est-ce qui se passe ici? – Nameless

+0

Is est analysé comme 'c1 c1()' donc la fonction 'c1' (qui cache la classe' c1') avec le type de retour 'c1' (la classe). – Jarod42