如何使用赋值运算符返回对象?

时间:2017-06-27 20:46:38

标签: c++

假设我们有以下操作:

Object a = b.copy();

copy()基本上是一个复制对象并返回其副本的方法。

Object copy()
{ 
    Object copied_Object;
    /..do the copy../
    return copied_Object;
}

起初我认为返回会触发作业operator =和地点 操作的右侧字段的结果,但事实证明,实际上复制构造函数被激活,然后在函数内创建的Object被销毁。这就是我所知道的。

我的问题是,你能逐步向我解释在执行Object a = b.copy();时会发生什么吗?

1 个答案:

答案 0 :(得分:1)

Object a = b.copy();

是创建/构造/初始化Object的指令。不涉及作业。

分配看起来像这样,

object = something;

注意没有对象声明。

现在

Object a = b.copy();

通过类型Object的b.copy()构造a,这需要Object能够由另一个Object构造。这当然是复制构造函数。编译器生成的,或默认的或显式的复制构造函数。

执行语句时,复制函数将执行并通过

将创建的copied_Object传送给调用者
  1. 复制构造
  2. 复制省略,编译器将调用其黑魔盒并就地构造对象a。无需复制构造。正如Jarod所暗示的那样。
  3. 作为LogicStuff,建议你可以做

    Object copy()
    { 
        return *this;
    }
    

    这会将b对象的内容复制到返回值,并需要一个复制构造函数。

    我也会偷走Daniel H的评论并得出结论

    Object a = b;
    
    在正常情况下,

    将具有完全相同的语义。即最不惊讶的情况。