2016-09-13 86 views
-1

请纠正我,如果我错了,但我的理解是,一个拷贝构造函数是用来当你这样做:(C++)赋值运算符VS拷贝构造函数:当每个隐含使用

myClass newInstant = oldInstant; 

而分配当你做这个操作符使用:

myClass newInstant; 
newInstant = oldInstant; 

相信无论是实现同样的结果,而是因为它避免首先使用构造函数然后复制在新的数据首先是更直接。

我不确定的是这个,当一个函数被传递而不是通过引用的时候,它会使用复制构造函数或赋值运算符来复制它。此外,从函数返回瞬间时使用。

一般情况下,在哪些情况下使用了复制构造函数和赋值运算符?

最后一个问题,我将如何返回一个值而不复制它?如果返回的时刻是副本,并且旧的时刻已被删除,那么我将如何解决这个问题以提高效率?

感谢

+2

当使用现有的实例创建新实例并使用赋值运算符用另一个实例覆盖现有实例时,将使用复制构造函数。所以当按值传递某个函数时,会从现有函数创建一个新实例,因此........。如果您希望在按值返回时避免使用副本,请尝试确保您的代码允许优化返回值或移动任何复制代价高昂的代码。 –

+0

“最后一个问题”是一个单独的问题。请坚持每个问题1个问题。您应该能够通过搜索该网站找到该问题的答案 –

回答

1

当你初始化一个exisiting一个喜欢你的榜样的对象拷贝构造函数用于:

vClass oldInstant; 
yClass newInstant = oldInstant; // invoking copy constructor 

赋值运算符是用来分配的东西比方说,现有的对象到另一个现有。

myClass newInstant; // invoking myClss constructor. so from now and on newInstant is already existing object; 
newInstant = oldInstant; //oldInstant is also an already existing object. now assign one object to another. (assigning oldInstant to newInstant) 

请记住,他们的使用是完全不同的,但每个人都有自己的用处。 ***有时我们想要创建一个对象并为其分配另一个存在的(复制构造函数),因为我们可能想要保存原始对象并在副本上执行某些操作。

***赋值运算符我们不能避免使用它!你能否在数学运算中做一些计算,而不需要等于运算符'='?

东西拷贝构造函数和赋值操作符应该做的:

***拷贝构造函数时,应该有一些 内存堆(指针与new关键字分配)使用“深层复制”而不是“浅拷贝”

这只是一些解释,但你应该先询问一下,因为成员会投票给你。

0

技术上的拷贝构造函数调用以下情况:

  1. 明确的拷贝构造
  2. 按值调用
  3. 返回由值

赋值运算符是实现抹杀的用新的内容退出实例的旧内容。正如你展示的一个例子:

myClass newInstant; 
newInstant = oldInstant;//assignment operator 

请记住,它们的工作方式不同。复制交换涉及赋值运算符。

关于你最后的问题,现代编译器应用拷贝构造函数elision来消除不必要的拷贝构造函数调用。