Контрольный список для записи конструктора копии и оператора присваивания в C++

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
18
задан Daniel Daranas 28 August 2013 в 16:58
поделиться

4 ответа

Сначала убедитесь, что действительно необходимо поддерживать копию. Большую часть времени это не имеет место, и таким образом запрещающий обоих способ пойти.

Иногда, необходимо будет все еще обеспечить дублирование на классе от полиморфной иерархии в этом случае: отключите оператор присваивания, запишите (защищенный?) копируют конструктора и обеспечивают виртуальный клон () функция.

Иначе, в случае Вы пишете класс значения, Вы вернулись в землю Ортогональной Канонической формы Coplien. Если у Вас будет участник, который не может быть тривиально скопирован, то необходимо будет предоставить конструктору копии, деструктору, оператору присваивания и конструктору по умолчанию. Это правило может быть усовершенствовано, видеть, например: Закон Большого Два

я также рекомендовал бы взглянуть на C++ FAQ относительно операторов присваивания , и в идиома копии-и-подкачки и в GOTW.

15
ответ дан 30 November 2019 в 09:07
поделиться

Компилятор генерировал работу версий в большинстве ситуаций.

необходимо думать немного тяжелее о проблеме, когда объект содержит НЕОБРАБОТАННЫЙ указатель (аргумент в пользу того, что не имелись НЕОБРАБОТАННЫЕ указатели). Таким образом, у Вас есть НЕОБРАБОТАННЫЙ указатель, второй вопрос - Вы, владеют указателем (он удаляет Вами)? Раз так затем необходимо будет применить правило 4.

Владение больше чем 1 НЕОБРАБОТАННЫМ указателем становится все больше трудным сделать правильно (Увеличение сложности не линейно ни один [но это наблюдательно, и у меня нет реальной статистики для резервного копирования того оператора]). Таким образом, если у Вас есть больше чем 1 НЕОБРАБОТАННЫЙ указатель, думают об обертывании каждого в его собственном классе (некоторая форма интеллектуального указателя).

Правило 4: Если объект является владельцем НЕОБРАБОТАННОГО указателя затем, необходимо определить следующие 4 участников, чтобы удостовериться, что Вы обрабатываете управление памятью правильно:

  • Конструктор
  • Конструктор Копии
  • Оператор присваивания
  • Деструктор

, Как Вы определяете, они будут зависеть от ситуаций. Но вещи не упустить:

  • Конструкция По умолчанию: указатель Набора на ПУСТОЙ УКАЗАТЕЛЬ
  • Конструктор Копии: Используйте Копию и Подкачку ideum для обеспечения к "Сильной Гарантии Исключения"
  • Оператор присваивания: Проверьте на присвоение на сам
  • Деструктор: Примите меры против распространения исключений из деструктора.
4
ответ дан 30 November 2019 в 09:07
поделиться

попытайтесь считать это.

http://www.icu-project.org/docs/papers/cpp_report/the_anatomy_of_the_assignment_operator.html

является очень хорошим анализом Оператора присваивания

1
ответ дан 30 November 2019 в 09:07
поделиться

Я понятия не имею об исключении безопасно здесь, но я иду этим путем. Давайте предположим, что это - шаблонная обертка массива. Надежда это помогает :)

Array(const Array& rhs)
    {
        mData = NULL;
        mSize = rhs.size();
        *this = rhs;
    }

    Array& operator=(const Array& rhs)
    {
        if(this == &rhs)
        {
            return *this;
        }

        int len = rhs.size();

        delete[] mData;

        mData = new T[len];

        for(int i = 0; i < len; ++i)
        {
            mData[i] = rhs[i];
        }

        mSize = len;

        return *this;
    }
-2
ответ дан 30 November 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: