web-dev-qa-db-fra.com

constructeur de copie par défaut

Le (implicite) par défautconstructeur de copie peut-il être appelé pour un classe qui a déjà constructeur défini par l'utilisateur mais ce n'est pas le constructeur de copie ?

Si c'est possible, supposons que nous définissions explicitement le constructeur de copie pour la classe , maintenant le constructeur par défaut (implicite) peut-il être appelé?

32
sourabh912

Tout d'abord, clarifions un peu notre vocabulaire. Un constructeur par défaut est un constructeur qui peut être appelé sans aucun argument. Un constructeur de copie est un constructeur qui peut être appelé avec un seul argument du même type. Compte tenu de cela, un "constructeur de copie par défaut" serait un constructeur avec une signature quelque chose comme:

class MyClass
{
public:
    static MyClass ourDefaultInstance;
    //  default copy constructor...
    MyClass( MyClass const& other = ourDefaultInstance );
};

D'une certaine manière, je ne pense pas que c'est ce que vous vouliez dire. I pensez ce que vous demandez est un constructeur de copie implicitement déclaré ou défini implicitement; un constructeur de copie dont la déclaration ou la définition est fournie implicitement par le compilateur. Le compilateur fournira toujours la déclaration sauf si vous fournissez une déclaration de quelque chose qui peut être considéré comme un constructeur de copie. Fournir d'autres constructeurs n'empêchera pas le compilateur de déclarer implicitement un constructeur de copie.

Ceci est différent du constructeur par défaut —tout le constructeur défini par l'utilisateur empêchera le compilateur de déclarer implicitement un constructeur par défaut. Cela signifie que si vous avez un constructeur de copie défini par l'utilisateur, le compilateur ne déclarera pas implicitement un constructeur par défaut.

Le deuxième point important est que vous n'appelez pas de constructeurs. Le compilateur les appelle dans certains contextes bien définis: définition de variable et conversion de type, principalement. Le compilateur ne peut appeler que les constructeurs déclarés (y compris ceux qui sont implicitement déclarés). Donc, si vous avez un constructeur défini par l'utilisateur (copie ou autre) et que vous ne définissez pas de constructeur par défaut, le compilateur ne peut appeler le constructeur que dans des contextes où il a des arguments pour l'appeler.

Pour résumer ce que je pense que vos questions sont: le compilateur fournira un constructeur de copie implicite même si la classe a d'autres constructeurs définis par l'utilisateur, à condition qu'aucun de ces constructeurs ne puisse être considéré comme un constructeur de copie. Et si vous fournissez un constructeur de copie défini par l'utilisateur, le compilateur pas fournira un constructeur de copie par défaut déclaré implicitement.

90
James Kanze

http://www.cplusplus.com/articles/y8hv0pDG/

Le constructeur de copie par défaut existe si vous n'en avez pas défini un. Donc oui, vous pouvez appeler le constructeur de copie par défaut, si vous n'avez pas défini de constructeur de copie, cependant si vous définissez un constructeur de copie dans votre classe, vous ne pourrez pas appeler le constructeur par défaut.

11
CrazyCasta

Il n'existe pas de constructeur de copie par défaut. Il existe des constructeurs par défaut et des constructeurs de copie et ce sont des choses différentes.

Le constructeur de copie implicitement défini (ce que je pense être ce que vous entendez par "constructeur de copie par défaut") copiera les membres non statiques de type classe en utilisant leur constructeur de copie, pas leur constructeur par défaut. Le constructeur de copie défini implicitement est utilisé lorsque vous ne définissez pas votre propre constructeur de copie.

3
NullPoiиteя