复制构造函数调用
Copy Constructor Calling
我很困惑,为什么当我在该函数中创建对象并返回它时,没有调用我明确定义的复制构造函数。类似于:
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
对象。
相关文章:
- 当从函数参数中的临时值调用复制构造函数时
- 为什么调用复制构造函数而不是移动构造函数?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- push_back std::vector,则重复调用复制构造函数
- 减少复制构造函数调用
- 为什么调用复制构造函数来构造空unique_ptr向量?
- 复制elision、std::move和链式函数调用
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 我打算调用initializer_list构造函数,如果存在,则事先调用复制构造函数:为什么?
- 构造函数初始值设定项列表未调用复制构造函数
- 为什么在我的代码中调用复制构造函数而不是移动构造函数?
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 通过引用传递对象时是否调用复制构造函数?
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- 为什么要抛出引用调用复制构造函数的异常?
- 为什么即使参数标记为"const",也会调用复制构造函数?
- Clang-Tidy:移动构造函数通过调用复制构造函数来初始化类成员
- linux 是否"rename"函数调用块,直到复制(当源和目标在不同磁盘中时)完成
- 为什么当我添加一个不同的对象(复制构造函数中的参数)时调用复制构造函数?
- 为什么调用复制构造函数,当我只返回对象 c++ 的引用时