член копирование класса - PullRequest
3 голосов
/ 16 марта 2011

При изучении понятия «копирование элементов» книга дает следующее утверждение:

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

Я не совсем понимаю, что на самом деле хочет сделать это утверждение?Или к какому сценарию относится это утверждение?Спасибо.

Ответы [ 4 ]

2 голосов
/ 16 марта 2011

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

1) Когда элемент является ссылкой (то есть ссылается на экземпляр переменной, такой как указатель)

class Foop {
    int& reference;
};

2) Когда переменная-член постоянна

class Foople {
    const int someConst;
};

3) Если в каком-то другом классе нет конструктора копирования, и у вас есть переменная-член этого типа, очевидно, что ее нельзя скопировать с помощью метода по умолчанию (который использует конструкторы копирования)

class Uncopyable {
private:
    Uncopyable(Uncopyable const& other);
};

class Fleep {
    Uncopyable uncopyable;
};

В этих случаях вам потребуется написать собственный оператор присваивания (или, возможно, обойтись без него).

2 голосов
/ 16 марта 2011

Если у вас есть член в вашем классе, который не является статическим (общим для всех экземпляров класса) и имеет либо

  1. ссылка (указатель высокого уровня)
  2. постоянная
  3. пользовательский тип с динамическими данными (такой же, как класс, о котором мы говорим)

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

0 голосов
/ 16 марта 2011

Это относится к разнице между:

class A { int a; };

и

class B { int& a; };

Для класса A компилятор сгенерирует оператор неявного присваивания (=), но вв случае B это невозможно.Это потому, что ссылки в C ++ не имеют семантики указателей.то есть вы не можете изменить то, к чему относится контрольная точка после ее создания, следовательно, неявный конструктор копирования не сможет скопировать этот элемент.То же самое касается константных членов (которые явно помечены как неизменяемые) и членов, у которых нет операторов присваивания (неявных или явных).

Оператор присваивания по умолчанию для A по существу сделает это:

class A
{
   A& operator=(A const& a_) { a = a_.a; }
   int a;
};
0 голосов
/ 16 марта 2011
class ClassA
{
    int& _myReferenceMember;
    const int _myConstant;
    ClassB _objWhereClassBHasNoCopyConstructor;
}

Выше приведены примеры трех описанных вами случаев.И, как вы цитировали, вы должны написать собственный конструктор копирования (если вам вообще нужен конструктор копирования) или изменить переменные-члены.

...