перегрузка оператора присваивания без использования = - PullRequest
0 голосов
/ 08 марта 2019

Мне задали вопрос в интервью.

Есть ли способ, которым вы можете назначить значение одного пользовательского объекта другому пользовательскому объекту без использования оператора =.

По сути, он попросил меня перегрузить оператор присваивания для класса таким образом, чтобы перегруженный оператор присваивания в свою очередь не использовал примитивные типы = оператор.

Является ли memcpy правильным подходом

1 Ответ

1 голос
/ 08 марта 2019

Заданный вопрос: Является ли memcpy правильным подходом? Не всегда.

Подразумеваемый вопрос: Перегрузка оператора присваивания без использования =? Использование Копировать иИдиома свопа .

Я продемонстрирую подразумеваемый вопрос, объяснив, почему ответ на поставленный вопрос - нет.

memcpy выполняет двоичное копирование без применения какого-либо контекста к природепеременные в копируемом объекте.Это может быть исключительно опасно и может использоваться только на объектах, которые легко копируются .

Рассмотрим следующий случай:

struct A
{
    int buffersize;
    char * buffer;
    A(int size):buffersize(size), buffer(new char[buffersize])
    {
    }
    A(const A& source):buffersize(source.buffersize), buffer(new char[buffersize])
    {
        memcpy(buffer, source.buffer, buffersize);
    }
    ~A()
    {
        delete[] buffer;
    }
    A& operator=(A source) // Assignment via Copy and Swap Idiom
    {
        std::swap(buffersize, source.buffersize);
        std::swap(buffer, source.buffer);
    }
}

Этот пример очень глупый и очень простой.Любой здравомыслящий человек будет использовать std::vector, но он реализует Правило Трех ( Что такое Правило Трех? ), чтобы его можно было безопасно копировать, но при этом его нельзя копировать тривиально.

Видите работу, выполняемую в конструкторе копирования?Это не будет выполнено memcpy.memcpy скопирует значение buffer, адрес и оставит вас с двумя объектами, указывающими на один и тот же buffer.Если совместное использование буфера не окажется фатальным раньше, в конечном итоге оба деструктора должны будут работать, и buffer будет освобожден дважды.

Примечание memcpy ИСПОЛЬЗУЕТСЯ для копирования внутреннего буфера.Буфер представляет собой массив простых старых данных (POD), которые можно легко скопировать.Если это не было тривиально копируемым, следует следовать предложению πάντα ῥεῖ о std::copy.Мы должны использовать std:::copy в любом случае, чтобы в будущем код было легче изменить, но тогда в примере не показано безопасное использование memcpy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...