C++ Конструктор копирования

Классы & объекты C++

Конструктор копированияЭто специальный конструктор, который при создании объекта использует ранее созданный объект того же класса для инициализации вновь созданного объекта. Конструктор копирования обычно используется для:

  • Путём использования другого объекта того же типа для инициализации вновь созданного объекта.

  • Скопировать объект и передать его в качестве параметра в функцию.

  • Скопировать объект и вернуть объект из функции.

Если в классе не определён конструктор копирования, компилятор определит его сам. Если класс имеет переменные-указатели и динамическое выделение памяти, то он должен иметь конструктор копирования. Наиболее распространённая форма конструктора копирования выглядит следующим образом:

classname (const classname &obj) { // Тело конструктора }

Здесь,objЭто ссылка на объект, и этот объект используется для инициализации другого объекта.

Пример

#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 << "Вызов конструктора" << endl; // Выделение памяти для указателя ptr = new int; *ptr = len; } Line::Line(const Line &obj) { cout << "Вызовите конструктор копирования и выделите память для указателя ptr" << endl; ptr = new int; *ptr = *obj.ptr; // копировать значение } Line::~Line(void) { cout << "Освободить память" << endl; delete ptr; } int Line::getLength( void ) { return *ptr; } void display(Line obj) { cout << "размер линии :" << obj.getLength() <<endl; } // Главная функция программы int main( ) { Line line(10); display(line); return 0; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

调用构造函数
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
释放内存

Следующий пример немного изменяет приведённый выше пример, используя существующий объект того же типа для инициализации только что созданного объекта:

Пример

#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 << "Вызов конструктора" << endl; // Выделение памяти для указателя ptr = new int; *ptr = len; } Line::Line(const Line &obj) { cout << "Вызовите конструктор копирования и выделите память для указателя ptr" << endl; ptr = new int; *ptr = *obj.ptr; // копировать значение } Line::~Line(void) { cout << "Освободить память" << endl; delete ptr; } int Line::getLength( void ) { return *ptr; } void display(Line obj) { cout << "размер линии :" << obj.getLength() <<endl; } // Главная функция программы int main( ) { Line line1(10); Line line2 = line1; // Здесь также вызывается конструктор копирования. display(line1); display(line2); return 0; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

调用构造函数
调用拷贝构造函数并为指针 ptr 分配内存
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
释放内存
释放内存

Классы & объекты C++

Другие расширения