Рубрики

Когда компилятор создает конструкторы по умолчанию и копирует конструкторы в C ++?

В C ++ компилятор создает конструктор по умолчанию, если мы не определяем наш собственный конструктор (см. Это ). Созданный компилятором конструктор по умолчанию имеет пустое тело, т. Е. Он не присваивает значения по умолчанию элементам данных ( в java конструкторы по умолчанию назначают значения по умолчанию ).

Компилятор также создает конструктор копирования, если мы не пишем наш собственный конструктор копирования. В отличие от конструктора по умолчанию, тело конструктора копирования, созданного компилятором, не является пустым, оно копирует все элементы данных переданного объекта в создаваемый объект.

Что происходит, когда мы пишем только конструктор копирования — компилятор создает конструктор по умолчанию?
Компилятор не создает конструктор по умолчанию, если мы пишем какой-либо конструктор, даже если это конструктор копирования. Например, следующая программа не компилируется.

#include <iostream>

using namespace std;

  

class Point

{

    int x, y;

public:

   Point(const Point &p) { x = p.x; y = p.y; }

};

  

int main()

{

    Point p1;  // ОШИБКА КОМПИЛЕРА

    Point p2 = p1;

    return 0;

}

Выход:

COMPILER ERROR: no matching function for call to 'Point::Point()

Как насчет обратного — что происходит, когда мы пишем нормальный конструктор и не пишем конструктор копирования?
Обратное не верно. Компилятор создает конструктор копирования, если мы не пишем свой собственный. Компилятор создает его, даже если мы написали другие конструкторы в классе. Например, приведенная ниже программа работает нормально.

#include <iostream>

using namespace std;

  

class Point

{

    int x, y;

public:

   Point(int i, int j) { x = 10; y = 20; }

   int getX() { return x; }

   int getY() { return y; }

};

  

int main()

{

    Point p1(10, 20);

    Point p2 = p1; // Это хорошо компилируется

    cout << "x = " << p2.getX() << " y = " << p2.getY();

    return 0;

}

Выход:

x = 10 y = 20

Поэтому нам нужно писать конструктор копирования только тогда, когда у нас есть указатели или выделение ресурсов во время выполнения, таких как дескриптор файла, сетевое соединение и т. Д. (См. Это )

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Когда компилятор создает конструкторы по умолчанию и копирует конструкторы в C ++?

0.00 (0%) 0 votes