Подтвердить что ты не робот

Почему конструктор копирования имеет более одного параметра?

$12.8/2 - 'Конструктор без шаблона для класса X является конструктором копирования, если его первый параметр имеет тип X &, const X &, летучих X & или const летучих X &, и либо нет другие параметры или все остальные параметры имеют аргументы по умолчанию (8.3.6) 0,106) '

До сих пор я не встречал ни одного примера ситуации, когда необходимо объявить конструктор копирования с дополнительными параметрами по умолчанию.

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

4b9b3361

Ответ 1

У старого std::basic_string тоже есть:

basic_string(const basic_string& s, 
         size_type pos = 0, size_type n = npos)

Ответ 3

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

  • Копирование структуры данных, в которой копия будет заполнена дополнительными данными

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

  • Выполнять ли глубокую копию или мелкую копию значений элементов

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

  • Вербальная копия с логической копией

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

Ответ 4

У меня есть ситуация, когда требуется, чтобы конструктор копирования имел более одного параметра в одном из моих классов, включая глубокую копию.

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

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

[Edit]: просматривая мой код, кажется, что он еще более распространен, чем я, хотя и использую его в нескольких местах в другом месте.

Вот пример кода для любознательного (это упрощенная версия и на самом деле немного сложнее)

//----------------------------------------------------------------------------- 
scan_point::scan_point(scan_point const& rhs, simulation* sim_)
: m(rhs.m), sim(sim_)
//----------------------------------------------------------------------------- 
{    

}

-

simulation_(simulation_ const& rhs)
{
    //...
    for(typename ContainerType::const_iterator it = rhs.spContainer->begin(), endIt = rhs.spContainer->end();
        it != endIt; it++)
    {
        spContainer->push_back(new scan_point(*it, this));
    }
}

-

Чтобы сделать вещи менее болезненными во время копирования, я использую класс smart_ptr, который допускает глубокую копию и (в этом случае специально) встроить мои члены в структуру, чтобы компилятор автоматически сгенерировал копирование для всех других членов (см. пример на короткий пример: https://stackoverflow.com/info/469696/what-is-your-most-useful-c-c-utility/1609496#1609496).