Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Неправильный конструктор копирования

#cpp


В следующем фрагменте кода:

#include 
#include 

using std::cout;

class Point
{
    int x;

public:
    Point(int x)
    {
        this->x = x;
    }

    Point(Point p)
    {
        x = p.x;
    }

    int getX() { return x; }
};

int main(int argc, char* argv[])
{

    Point p1(10);
    Point p2 = p1;

    printf("%d", p2.getX());
    return 0;
}


Компилятор выдает такую ошибку:

invalid constructor; you probably meant 'Point (const Point&)


Почему так происходит?
    


Ответы

Ответ 1



В C++ конструктор копирования не может принимать копию объекта этого же класса, а вот по ссылке может (т.е. в вашем случае подойдет Point(Point& p), либо Point(const Point& p)). Представим, что такое допустимо Получается, что таким образом вы переопределяете конструктор копирования по умолчанию, тогда у компилятора не остается выбора (на самом деле просто запрещен такой вызов, но так звучит убедительнее) кроме как попытаться снова вызвать именно ваш конструктор копирования для передачи параметра в ваш же конструктор копирования и так далее (бесконечная рекурсия получается).

Ответ 2



Потому что копирующий конструктор должен иметь одну из стандартных форм: Point(const Point & copy); Point( Point & copy); Point(const volatile Point & copy); Point( volatile Point & copy);

Комментариев нет:

Отправить комментарий