c++ - 复制构造函数调用

标签 c++

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

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对象在函数体执行时已经构造完成。

关于c++ - 复制构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37088175/

相关文章:

c++ - kaldi函数在C++中只有头文件

c++ - 意外标记附近出现语法错误 '('

c++ - Win32 SetForegroundWindow 不可靠

C++ Getline 问题(没有重载函数的实例 "getline"

c++ - 将 std::future 和 std::promise 与非 std::thread 一起使用是否安全?

c++ - CMake 将文件复制到当前工作目录 Linux

c++ - 为什么 C++ STL vector 在做很多保留时会慢 1000 倍?

c++ - 插入 map 库无效

c++ - 从一个巨大的枚举中,我尝试通过使用一些模板技巧来创建一个函数来应用正确的操作而不使用开关主体

c++ - 在 Qt Gui 中使用 std::cout