Latest web development tutorials

C ++ constructeur de copie

Classe C ++ & Objets Classe C ++ & Objets

Le constructeur de copie est un constructeur spécial que lorsque vous créez un objet, l'objet est d'utiliser le même type de précédemment créé pour initialiser l'objet nouvellement créé.Le constructeur de copie est généralement utilisé:

  • En utilisant un autre objet du même type pour initialiser l'objet nouvellement créé.

  • Copiez l'objet passer comme paramètre à la fonction.

  • Copiez l'objet, et l'objet est renvoyée par la fonction.

Si la classe ne définit pas un constructeur de copie, le compilateur se définit. Si la classe avec une variable de pointeur, et l'allocation dynamique de mémoire, il doit avoir un constructeur de copie. constructeur Copie forme la plus courante est la suivante:

classname (const classname &obj) {
   // 构造函数的主体
}

Ici, obj est une référence à un objet, l'objet est utilisé pour initialiser un autre objet.

#include <iostream>

using namespace std;

class Line
{
   public:
      int getLength( void );
      Line( int len );             // 简单的构造函数
      Line( const Line &obj);  // 拷贝构造函数
      ~Line();                     // 析构函数

   private:
      int *ptr;
};

// 成员函数定义,包括构造函数
Line::Line(int len)
{
    cout << "Normal constructor allocating ptr" << endl;
    // 为指针分配内存
    ptr = new int;
    *ptr = len;
}

Line::Line(const Line &obj)
{
    cout << "Copy constructor allocating ptr." << endl;
    ptr = new int;
   *ptr = *obj.ptr; // copy the value
}

Line::~Line(void)
{
    cout << "Freeing memory!" << endl;
    delete ptr;
}
int Line::getLength( void )
{
    return *ptr;
}

void display(Line obj)
{
   cout << "Length of line : " << obj.getLength() <<endl;
}

// 程序的主函数
int main( )
{
   Line line(10);

   display(line);

   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants:

Normal constructor allocating ptr
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Freeing memory!

Les exemples suivants de l'exemple ci-dessus légèrement modifié en utilisant le même type d'objets a pour initialiser l'objet nouvellement créé:

#include <iostream>

using namespace std;

class Line
{
   public:
      int getLength( void );
      Line( int len );             // 简单的构造函数
      Line( const Line &obj);  // 拷贝构造函数
      ~Line();                     // 析构函数

   private:
      int *ptr;
};

// 成员函数定义,包括构造函数
Line::Line(int len)
{
    cout << "Normal constructor allocating ptr" << endl;
    // 为指针分配内存
    ptr = new int;
    *ptr = len;
}

Line::Line(const Line &obj)
{
    cout << "Copy constructor allocating ptr." << endl;
    ptr = new int;
   *ptr = *obj.ptr; // copy the value
}

Line::~Line(void)
{
    cout << "Freeing memory!" << endl;
    delete ptr;
}
int Line::getLength( void )
{
    return *ptr;
}

void display(Line obj)
{
   cout << "Length of line : " << obj.getLength() <<endl;
}

// 程序的主函数
int main( )
{
   Line line1(10);

   Line line2 = line1; // 这里也调用了拷贝构造函数

   display(line1);
   display(line2);

   return 0;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants:

Normal constructor allocating ptr
Copy constructor allocating ptr.
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Freeing memory!
Freeing memory!

Classe C ++ & Objets Classe C ++ & Objets