复制构造函数的用途是什么,而赋值运算符'=';? 为什么C++提供了拷贝构造函数?赋值运算符可以执行相同的任务。复制构造函数比赋值运算符有什么优势吗?
无论是否有复制构造函数,您仍然必须将新对象初始化为稳定的初始状态,赋值运算符随后可以更新该状态复制构造函数的用途是什么,而赋值运算符'=';? 为什么C++提供了拷贝构造函数?赋值运算符可以执行相同的任务。复制构造函数比赋值运算符有什么优势吗?,c++,oop,copy-constructor,C++,Oop,Copy Constructor,无论是否有复制构造函数,您仍然必须将新对象初始化为稳定的初始状态,赋值运算符随后可以更新该状态 虽然您当然可以在没有复制构造函数的情况下实现这一点,但拥有复制构造函数有助于优化新对象的初始化,方法是预先将其设置为复制另一个对象的状态,而不需要您首先将新对象初始化为默认状态,然后再进行单独的赋值来重置该状态。这样,您就可以在1次操作而不是2次操作中设置新对象的状态。是的,这两次操作是不同的。您不能总是将复制构造函数实现为 Foo(const Foo& f) { *this = f;
虽然您当然可以在没有复制构造函数的情况下实现这一点,但拥有复制构造函数有助于优化新对象的初始化,方法是预先将其设置为复制另一个对象的状态,而不需要您首先将新对象初始化为默认状态,然后再进行单独的赋值来重置该状态。这样,您就可以在1次操作而不是2次操作中设置新对象的状态。是的,这两次操作是不同的。您不能总是将复制构造函数实现为
Foo(const Foo& f) {
*this = f;
}
赋值运算符假定您有一个有效的、完全构造的对象。复制构造函数不做这样的假设。这意味着,根据您的类,赋值运算符可能会在重新初始化之前尝试清除对象上的任何数据。或者甚至可以重新调整对象上已有数据的用途。使用复制构造函数可以完成的事情,而使用赋值运算符则无法(轻松或根本无法)完成:
您将如何
Foo复制(源代码)代码>没有复制构造函数?没有复制构造函数也很难传递值。@NathanOliver我认为OP要求的是Foo copy(source)的区别/好处代码>vsFoo复制;拷贝=源代码>复制构造函数可以是深度复制,而赋值运算符可以用于分配内存地址这是否回答了您的问题?通常,应该实现赋值运算符来使用复制构造函数,而不是相反。绝对是@Remy。可能是这里提到的工作。@RemyLebeau,如果这个类是抽象的,我不想将实现转移到派生类中怎么办?一个抽象类仍然可以有构造函数和赋值运算符,哪些派生类可以根据需要调用。@RemyLebeau如果我想将所有复制构造代码放入已经有赋值运算符的基类中,我可以使用*this=f代码>构造函数的类型。然而,我不能通过复制构造来执行任务。问题是这个问题是否有一些惯用的解决方案。关于第4点,复制通过引用构造的类也是复制可分配的,这不是一个坏主意吗?可能。我试着想一个例子,在这个例子中,你想这样做,但实际上什么都不想出来。Re 2:你在那里掉了一个“高效”的词,因为这肯定是可能的,尽管是浪费。我试着用“要么容易,要么根本不”的评论来掩盖这一点。也可以通过丢弃常量来分配具有常量成员(#5)的类,或者分配一个对象而不调用其构造函数,然后对其赋值。这不是一个好主意。这在中国是不正确的