В чем разница между оператором присваивания и конструктором копирования?
Я не понимаю разницы между конструктором присваивания и конструктором копирования в C++. Это выглядит так:
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
Я хочу знать, как выделить память конструктора присваивания и конструктора копирования?
8 ответов:
A конструктор копирования используется для инициализации a ранее неинициализированные объект из данных другого объекта.
A(const A& rhs) : data_(rhs.data_) {}
An оператор присваивания используется для замены данных предварительно инициализирована объект с данными другого объекта.
A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}
вы можете заменить копирование конструкции по умолчанию строительство плюс назначение, но это было бы менее эффективно.
(в качестве примечания: мои реализации выше-это именно те, которые компилятор предоставляет вам бесплатно, поэтому не имеет большого смысла реализовывать их вручную. Если у вас есть один из этих двух, вполне вероятно, что вы вручную управлять некоторым ресурсом. В таком случае, per правило трех, вам, скорее всего, также понадобится другой плюс деструктор.)
разница между конструктором копирования и оператором присваивания вызывает много путаницы для новых программистов, но это действительно не так сложно. Подведение итогов:
- если новый объект должен быть создан до начала копирования, используется конструктор копирования.
- если новый объект не должен быть создан до начала копирования, используется оператор присваивания.
пример для назначения оператор:
Base obj1(5); //calls Base class constructor Base obj2; //calls Base class default constructor obj2 = obj1; //calls assignment operator
пример для конструктора копирования:
Base obj1(5); Base obj2 = obj1; //calls copy constructor
первый-это инициализация копирования, второй-просто назначение. Нет такой вещи, как конструктор присваивания.
A aa=bb;
использует созданный компилятором конструктор копирования.
A cc; cc=aa;
использует конструктор по умолчанию для создания
cc
, а затем *оператор присваивания** (operator =
) на уже существующий объект.Я хочу знать, как выделить память в конструкторе присваивание и копирование конструктор?
IDK что вы подразумеваете под выделением памяти в этом случае, но если вы хотите увидеть, что происходит, вы можете:
class A { public : A(){ cout<<"default constructor"<<endl;}; A(const A& other){ cout<<"copy constructor"<<endl;}; A& operator = (const A& other){cout <<"assignment operator"<<endl;} };
Я также рекомендую вам взглянуть на:
почему конструктор копирования вызывается вместо конструктора преобразования?
то, что сказал @ Luchian Grigore, реализовано так
class A { public : int a; A(){ cout<<"default constructor"<<endl;}; A(const A& other){ cout<<"copy constructor"<<endl;}; A& operator = (const A& other){cout <<"assignment operator"<<endl;} }; void main() { A sampleObj; //Calls default constructor sampleObj.a = 10; A copyConsObj = sampleObj; //Initializing calls copy constructor A assignOpObj; //Calls default constrcutor assignOpObj = sampleObj; //Object Created before so it calls assignment operator }
выход
конструктор по умолчанию
конструктор копирования
конструктор по умолчанию
оператор присваивания
разница между конструктором копирования и конструктор присваивания:
- в случае конструктор копирования создает новый объект.(
<classname> <o1>=<o2>
)- в случае конструктора присваивания он не будет создавать никаких объектов, значит, он применяется к уже созданным объектам (
<o1>=<o2>
).и основные функциональные возможности в обоих одинаковы, они будут копировать данные из o2 в O1 член за членом.
Я хочу добавить еще один пункт на эту тему. "Операторная функция оператора присваивания должна быть записана только как функция-член класса."Мы не можем сделать это как функцию друга в отличие от других двоичных или унарных операторов.
Что-то добавить о конструкторе копирования:
при передаче объекта по значению, он будет использовать конструктор копирования
когда объект возвращается из функции по значению, то он будет использовать конструктор копирования
при инициализации объекта с использованием значений другого объекта (как в приведенном примере).
простыми словами,
конструктор копирования вызывается, когда новый объект создается из существующего объекта, как копия существующего объекта. А оператор присваивания вызывается, когда уже инициализированному объекту присваивается новое значение из другого существующего объекта.
пример
t2 = t1; // calls assignment operator, same as "t2.operator=(t1);" Test t3 = t1; // calls copy constructor, same as "Test t3(t1);"