11
votes

Qu'est-ce qu'un constructeur de copie en C ++?

à la page 6 de Scott Meyers efficace C ++ , le terme "constructeur de copie" est défini. J'utilise le livre de Schiltdt comme référence et je ne peux trouver aucune mention de constructeurs de copies. Je reçois l'idée, mais est-ce une partie standard de C ++? Ces constructeurs seront-ils appelés quand un passage d'une classe par valeur?


5 commentaires

Eh bien, ce serait typique de Schildt - pourquoi sur terre les gens utilisent-ils ses livres?


S'il vous plaît, ne prenez pas les livres de Schildt sans grain de sel. Google pour le terme "Bullschildt" et voir par vous-même. Plus sérieusement, lire des critiques des livres de Schildt sur ACCU; La plupart d'entre eux ne sont pas favorables.


@Neil: Bien que j'ai aussi entendu de mauvaises choses sur les livres de Schildt, c'est difficile à croire qu'il ne parle pas de constructeurs de copies.


N'utilisez pas les livres de Schildt. Essayez accéléré C ++, §11.3. Vous me remercierez plus tard.


Dans mon expérience, Schildt Books Voir C ++ comme «C avec des pièces supplémentaires», plutôt qu'une nouvelle langue dérivée de C, donc il manque souvent le point avec des caractéristiques comme celle-ci. Essayez la comparaison de James B Coxlien's 'C ++ Style and Idioms'.


7 Réponses :


17
votes

Oui, les constructeurs de copies sont certainement un élément essentiel de la norme C ++. En savoir plus sur eux (et d'autres constructeurs) ici (FAQ C ++).

Si vous avez un livre C ++ qui n'enseigne pas sur les constructeurs de copies, jetez-le. C'est un mauvais livre.


0 commentaires

4
votes

voir COPY CONSTRUCTEUR sur Wikipedia.

Le L'idée de base est de copier constructeurs instancier de nouvelles instances en copiant des éléments existants: p> xxx pré>

donné une instance foo code>, appelez le constructeur de copie avec p> XXX PRE>

ou P>

Foo bar = foo;


0 commentaires

13
votes

Un constructeur de copie a le formulaire suivant:

void foo(example x);

int main(void)
{
    example x1; //normal ctor
    example x2 = x1; // copy ctor
    example x3(x2); // copy ctor

    foo(x1); // calls the copy ctor to copy the argument for foo

}


4 commentaires

Seulement si foo a le prototype Void FOO (exemple X); . Par exemple, void foo (const exemple & x); n'appellera aucun constructeur. Ou void foo (int x); qui peut appeler un opérateur de distribution opérateur int () sinon une erreur de compilateur.


J'ai édité le message pour inclure le prototype de FOO (), pour le rendre clair.


-1 "Un constructeur de copie a le formulaire suivant:" est incorrect. Il existe quatre formes possibles de constructeur de copie. De plus, l'exemple de classe est syntaxiquement invalide.


Un constructeur est le constructeur de copie si son premier paramètre est une référence au type de classe et tous les paramètres supplémentaires ont des valeurs par défaut.



1
votes

Le lien C ++ FAQ posté par ELI est NAIRE ET POST DE GBACON est correct.

Pour répondre explicitement à la deuxième partie de votre question: Oui, lorsque vous passez une instance d'objet par valeur, le constructeur de copie sera utilisé pour créer l'instance locale de l'objet dans la portée de l'appel de la fonction. Chaque objet a un "constructeur de copie par défaut" (gbacon allusion à ce car le "compilateur généré par défaut") qui copie simplement chaque membre d'objet - cela peut ne pas être ce que vous voulez si vos instances d'objet contiennent des pointeurs ou des références, par exemple.

Concernant de bons livres pour (re) Apprendre C ++ - J'ai d'abord appris qu'il a d'abord appris qu'il y a presque deux décennies et que cela a changé de bonne affaire depuis lors, je recommande "la réflexion de la pensée en c ++" de Bruce Eckel 1 et 2, disponible gratuitement ici (dans formulaire PDF et HTML):

http://www.ibiblio.org/pub/docs/books/ Eckel /


0 commentaires

2
votes

Copier Copy Constructor sera appelé à la suite des scénarios suivants:

  • Lors de la création de nouveaux objets d'un objet existant. P>

    MyClass NewClass::Get()
    {
      return ObjMyClass;
    }
    


0 commentaires

1
votes

Copie Constructor est une partie essentielle de C ++. Même si n'importe quel compilateur C ++ fournit un constructeur de copie par défaut si nous ne le définissons pas explicitement dans la classe, nous écrivons un constructeur de copie pour la classe pour les deux raisons suivantes.

  1. S'il y a une allocation de mémoire dynamique dans la classe. li>
  2. Si nous utilisons des variables de pointeur à l'intérieur de la classe. (sinon ce sera une copie peu profonde dans Quels sont les 2 objets pointeront sur le même emplacement de la mémoire.) li> ol>

    Pour effectuer une copie profonde, vous devez écrire un constructeur de copie et surcharger l'opérateur d'affectation, sinon la copie pointera sur l'original, avec des conséquences désastreuses. P>

    La syntaxe du constructeur de copie serait Soyez écrit comme ci-dessous: P>

    class Sample{
    
    public:
       Sample (const Sample &sample);
    
    };
    
    int main()
    {
    
       Sample s1;
       Sample s2 = s1;   // Will invoke Copy Constructor.
       Sample s3(s1);     //This will also invoke copy constructor.
    
       return 0;
    }
    


0 commentaires

0
votes

Un constructeur de copie est un constructeur qui fait une copie profonde. Vous devriez écrire votre propre constructeur de copie lorsqu'il existe une variable de type pointeur à l'intérieur de la classe. Le compilateur insérera automatiquement le constructeur de copie lorsqu'il n'y a pas de constructeur de copie explicite écrit à l'intérieur du code. Le type d'un paramètre de constructeur de copie doit toujours être un type de référence, pour éviter une récursion infinie en raison de la passe par type de valeur.

Sous le programme explique l'utilisation d'un constructeur de copie P>

#include <iostream>
#pragma warning(disable : 4996)
using namespace std;
class SampleTest {
private:
    char* name;
    int age;
public:   
    SampleTest(char *name1, int age) {
        int l = strlen(name1);
        name = new char[l + 1];
        strcpy(this->name, name1);
        this->age = age;
    }
        SampleTest(const SampleTest& s) { //copy constructor 
            int l = strlen(s.name);
            name = new char[l + 1];
            strcpy(this->name, s.name);
            this->age = s.age;
        }
    void displayDetails() {
        cout << "Name is " << this->name << endl;
        cout << "Age is " << this->age << endl;
    }
    void changeName(char* newName) {
        int l = strlen(newName);
        name = new char[l + 1];
        strcpy(this->name, newName);
    }
};
int main() {
    SampleTest s("Test", 10);
    s.displayDetails();
    SampleTest s1(s);
    cout << "From copy constructor" << endl;
    s1.displayDetails();
    s1.changeName("Test1");
    cout << "after changing name s1:";
    s1.displayDetails();
    s.displayDetails();
    cin.get();
    return 0;
}


0 commentaires