以下是一个采用复制构造函数的教科书中的一个程序:
h.keys.zip(h.values.map &:size).to_h
应该注意的是,复制构造函数的形式为:point(const point& p)而不是point(point& p)(后者是教科书中的内容,但不能' ; t编译所以我不得不切换到第一个,但我仍然无法理解为什么:()
教科书说将有3行"使用复制构造函数" ,对应于3次调用复制构造函数。我认为原因是,当你打电话时:b = fct(a)
功能" fct"制作一个(按值传递)的副本,因此可以进行一次调用
行:b = a:再次调用复制构造函数
然后将返回值复制到b(main中的变量,而不是fct中的变量),这是第3个。
但是在执行时,只有2个电话。谁能给我一个很好的解释呢?
答案 0 :(得分:3)
出现两个副本,因为命名返回值优化(NRVO)省略了其中一个副本。
point fct(point a)
{
point b=a;
return b;
}
point b = fct (a);
第一个副本是a
中参数main
到a
中参数fct
的副本。发生这种情况是因为point
是按值进行的。
第二个副本来自func内的a
到b
。
被删除的副本是按值返回b
的副本。在这种情况下,b
可以直接分配到呼叫站点的b
,因此不会发生任何副本。