复制构造函数调用

Copy Constructor Calling

本文关键字:函数调用 复制      更新时间:2023-10-16

我很困惑,为什么当我在该函数中创建对象并返回它时,没有调用我明确定义的复制构造函数。类似于:

ABC function()
{
ABC a;
return a;
}

然而,当我返回函数参数的对象时,会调用复制构造函数。它运行得很好。类似于:

ABC function2(const ABC &ab)
{
    return ab;
} 

但我在上面有一个问题,因为据说当一个函数按值返回一个对象时,就会调用复制构造函数。

请检查整个代码:

 #include<iostream>
using namespace std;

class ABC
{
public:
ABC()
{
cout<<"nDefault constructor";  
}
ABC(const ABC &ac) // copy constructor
{
cout<<"nCopy constructor called";
}

ABC function()
{
ABC a;
return a;// why here copy constructor is not called?
}
ABC function2(const ABC &ab)
{
    return ab;// here copy constructor is calling correctly. No problem!.
}

}; 

int main()
{
ABC a, b;
b=a.function();
b=a.function2(a);
}

谢谢。

该标准允许一些复制构造函数调用被优化掉,或者正如该标准所称,取消了,即使有问题的复制构造函数有副作用,例如输出一些文本。构造函数和析构函数调用的数量必须仍然匹配。但是,例如,从函数返回的对象可以直接在调用站点提供的存储中构建,该存储被称为RVO,返回值优化

实际上,复制构造函数被假设只复制,而不复制其他内容,无论它们实际做什么。


在你的第一个例子中,

ABC function()
{
    ABC a;
    return a;// why here copy constructor is not called?
}

…RVO是可以应用的,通过编译器和编译器选项,它显然是应用的。


第二个例子是

ABC function2(const ABC &ab)
{
    return ab;// here copy constructor is calling correctly. No problem!.
}

…不能应用RVO,因为在执行函数体时已经构造了ab对象。