复制构造函数被调用2次,而不是按预期调用3次?

时间:2015-06-26 09:12:11

标签: c++ constructor copy-constructor

以下是一个采用复制构造函数的教科书中的一个程序:

h.keys.zip(h.values.map &:size).to_h

应该注意的是,复制构造函数的形式为:point(const point& p)而不是point(point& p)(后者是教科书中的内容,但不能' ; t编译所以我不得不切换到第一个,但我仍然无法理解为什么:()

教科书说将有3行"使用复制构造函数" ,对应于3次调用复制构造函数。我认为原因是,当你打电话时:b = fct(a)

  1. 功能" fct"制作一个(按值传递)的副本,因此可以进行一次调用

  2. 行:b = a:再次调用复制构造函数

  3. 然后将返回值复制到b(main中的变量,而不是fct中的变量),这是第3个。

  4. 但是在执行时,只有2个电话。谁能给我一个很好的解释呢?

1 个答案:

答案 0 :(得分:3)

出现两个副本,因为命名返回值优化(NRVO)省略了其中一个副本。

point fct(point a)
{
    point b=a;
    return b;
}

point b = fct (a);

第一个副本是a中参数maina中参数fct的副本。发生这种情况是因为point是按值进行的。

第二个副本来自func内的ab

被删除的副本是按值返回b的副本。在这种情况下,b可以直接分配到呼叫站点的b,因此不会发生任何副本。