Поиск…


Синтаксис

  • Копировать конструктор
  • MyClass (const MyClass & other);
  • MyClass (MyClass & other);
  • MyClass (volatile const MyClass & other);
  • MyClass (volatile MyClass & other);
  • Конструктор присваивания
  • MyClass & operator = (const MyClass & rhs);
  • MyClass & operator = (MyClass & rhs);
  • MyClass & operator = (MyClass rhs);
  • const MyClass & operator = (const MyClass & rhs);
  • const MyClass & operator = (MyClass & rhs);
  • const MyClass & operator = (MyClass rhs);
  • Оператор MyClass = (const MyClass & rhs);
  • Оператор MyClass = (MyClass & rhs);
  • Оператор MyClass = (MyClass rhs);

параметры

шк Правая сторона равенства для конструкторов копирования и присваивания. Например, конструктор присваивания: MyClass operator = (MyClass & rhs);
Заполнитель Заполнитель

замечания

Другие полезные ресурсы для дальнейших исследований:

В чем разница между оператором присваивания и конструктором копирования?

оператор присваивания и конструктор копирования C ++

GeeksForGeeks

Статьи C ++

Оператор присваивания

Оператор присваивания - это когда вы заменяете данные уже существующим (ранее инициализированным) объектом данными другого объекта. Давайте рассмотрим это как пример:

// Assignment Operator
#include <iostream>
#include <string>

using std::cout;
using std::endl;

class Foo
{
  public:
    Foo(int data)
    {
        this->data = data;    
    }
    ~Foo(){};
    Foo& operator=(const Foo& rhs)
    {
            data = rhs.data; 
            return *this;
    }

    int data;
};

int main()
{
   Foo foo(2); //Foo(int data) called
   Foo foo2(42);
   foo = foo2; // Assignment Operator Called
   cout << foo.data << endl; //Prints 42
}

Здесь вы можете увидеть оператор присваивания, когда я уже инициализировал объект foo . Затем позже я назначаю foo2 в foo . Все изменения, появляющиеся при вызове этого оператора равенства, определяются в вашей функции operator= . Вы можете увидеть текущую версию здесь: http://cpp.sh/3qtbm

Копировать конструктор

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

// Copy Constructor
#include <iostream>
#include <string>

using std::cout;
using std::endl;

class Foo
{
  public:
    Foo(int data)
    {
        this->data = data;    
    }
    ~Foo(){};
    Foo(const Foo& rhs)
    {
            data = rhs.data; 
    }

    int data;
};

int main()
{
   Foo foo(2); //Foo(int data) called
   Foo foo2 = foo; // Copy Constructor called
   cout << foo2.data << endl;
}

Вы можете увидеть здесь Foo foo2 = foo; в основной функции я сразу назначаю объект перед его инициализацией, которая, как сказано ранее, означает, что это конструктор копирования. И обратите внимание, что мне не нужно было передавать параметр int для объекта foo2 так как я автоматически вытащил предыдущие данные из объекта foo. Вот пример вывода: http://cpp.sh/5iu7

Копировать конструктор Vs Assignment Constructor

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

// Copy vs Assignment Constructor
#include <iostream>
#include <string>

using std::cout;
using std::endl;

class Foo
{
  public:
    Foo(int data)
    {
        this->data = data;    
    }
    ~Foo(){};
    Foo(const Foo& rhs)
    {
            data = rhs.data; 
    }

    Foo& operator=(const Foo& rhs)
    {
        data = rhs.data; 
        return *this;
    }

    int data;
};

int main()
{
   Foo foo(2); //Foo(int data) / Normal Constructor called
   Foo foo2 = foo; //Copy Constructor Called
   cout << foo2.data << endl;

   Foo foo3(42);
   foo3=foo; //Assignment Constructor Called
   cout << foo3.data << endl;
}

Выход:

2
2

Здесь вы можете сначала вызвать конструктор копирования, выполнив строку Foo foo2 = foo; , Поскольку мы не инициализировали его ранее. Затем мы вызываем оператор присваивания на foo3, поскольку он уже инициализирован foo3=foo ;



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow