Latest web development tutorials

C ++ copy constructor

C ++ Kelas & Objek C ++ Kelas & Objek

Copy constructor adalah constructor khusus yang ketika Anda membuat sebuah objek, objek adalah dengan menggunakan jenis yang sama dari sebelumnya dibuat untuk menginisialisasi objek yang baru dibuat.Copy constructor biasanya digunakan:

  • Dengan menggunakan objek lain dari jenis yang sama untuk menginisialisasi objek yang baru dibuat.

  • Salin objek lulus sebagai parameter ke fungsi.

  • Salin objek, dan objek dikembalikan dari fungsi.

Jika kelas tidak menentukan copy constructor, compiler itu sendiri mendefinisikan. Jika kelas dengan variabel pointer, dan alokasi memori dinamis, ia harus memiliki copy constructor. Copy constructor bentuk yang paling umum adalah sebagai berikut:

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

Di sini, obj adalah referensi ke sebuah obyek, obyek yang digunakan untuk menginisialisasi objek lain.

#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;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

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

Contoh berikut dari contoh di atas sedikit dimodifikasi dengan menggunakan jenis yang sama dari objek harus menginisialisasi objek yang baru dibuat:

#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;
}

Ketika kode di atas dikompilasi dan dijalankan, menghasilkan hasil sebagai berikut:

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!

C ++ Kelas & Objek C ++ Kelas & Objek