C++
Копирование и назначение
Поиск…
Синтаксис
- Копировать конструктор
- 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); |
---|---|
Заполнитель | Заполнитель |
замечания
Другие полезные ресурсы для дальнейших исследований:
В чем разница между оператором присваивания и конструктором копирования?
Оператор присваивания
Оператор присваивания - это когда вы заменяете данные уже существующим (ранее инициализированным) объектом данными другого объекта. Давайте рассмотрим это как пример:
// 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
;