在类中重载运算符=
和复制构造函数之间有什么区别?
每个上下文都叫做?
我的意思是,如果我有以下内容:
Person *p1 = new Person("Oscar", "Mederos");
Person *p2 = p1;
使用哪一个?然后当使用另一个时?
修改
只是澄清一下:
我已经知道如果我们显式调用复制构造函数Person p1(p2)
,将使用复制构造函数。我想知道的是当每个人都使用时,而是使用=
运算符,而不是@Martin指出。
答案 0 :(得分:12)
在你的情况下,当你复制指针时都没有使用。
Person p1("Oscar", "Mdderos");
Person extra;
复制构造函数
Person P2(p1); // A copy is made using the copy constructor
Person P3 = p2; // Another form of copy construction.
// P3 is being-initialized and it uses copy construction here
// NOT the assignment operator
作业:
extra = P2; // An already existing object (extra)
// is assigned to.
值得一提的是,赋值运算符可以使用Copy and Swap
idium以复制构造函数的形式编写:
class Person
{
Person(std::string const& f, std::string const& s);
Person(Person const& copy);
// Note: Do not use reference here.
// Thus getting you an implicit copy (using the copy constructor)
// and thus you just need to the swap
Person& operator=(Person copy)
{
copy.swap(*this);
return *this;
}
void swap(Person& other) throws()
{
// Swap members of other and *this;
}
};
答案 1 :(得分:5)
复制构造函数是构造函数,它会创建一个对象。特别是,复制构造函数创建一个对象,该对象在语义上与另一个已经存在的对象相同,并且它对其进行“复制”:
Person newperson(oldperson); // newperson is a "copy" of oldperson
赋值运算符根本不是构造函数,而是只能在现有对象上调用的普通成员函数。它的目的是为你的对象分配另一个对象的语义,这样在赋值之后两者在语义上是相同的。你通常不会“重载”赋值运算符,你只是定义它。
Person p; // construct new person
/* dum-dee-doo */
p = otherperson; // assign to p the meaning of otherperson, overwriting everything it was before
// invokes p.operator=(otherperson)
请注意,如果与对象(使用==
)进行比较是有意义的,那么复制构造和赋值都应该表现得如下:
Person p1(p2);
assert(p1 == p2);
p1 = p3;
assert(p1 == p3);
您没有被迫保证这一点,但是您的班级用户通常会采取这种行为。实际上,编译器假定Person p1; Person p2(p1);
需要p1 == p2;
。
最后,作为最后的一点,如其他地方所述,请注意Person p = p2;
字面上表示Person p(p2)
(复制构造),而从不 { {1}}。这是一种语法糖,允许您在不影响效率的情况下编写自然的代码(甚至是正确性,因为您的类甚至可能不是默认构造的。)
答案 2 :(得分:0)
复制构造函数通过使用参数对象的内容构造新对象。一个 重载赋值运算符将现有对象的内容分配给另一个现有对象 同一个对象。