当我定义一个具有类(非引用)返回类型的函数时,调用类的默认构造函数或复制构造函数
Which one -- default or copy constructor -- of a class gets called when I define a function that has (non-reference) return type of that class?
当我用前面提到的类的返回类型在另一个类中定义函数时,我很困惑为什么我必须为这个类编写复制构造函数。
例如:
class Foo{
// attributes
public:
Foo(){...}
// I had to write the CC
Foo(const Foo& obj){
//...
}
}
class Bar{
// ....
// This is the function
Foo SomeFunction()
{
Foo myVar;
// ....
return myVar;
}
我通过cout
ing检查了复制构造函数是否被实际调用。
不过,我需要确认,因为在这种情况下调用默认构造函数似乎更合乎逻辑,比如在创建myVar
的这一行中。
我是一个初学者,所以我正试着把注意力集中在这些电话上。
行
Foo myFunc;
调用默认构造函数。
线路
return myFunc;
调用复制构造函数,因为函数的返回类型是Foo
。函数返回的对象不是myFunc
,而是myFunc
的副本。当函数返回时,myFunc
被删除。副本是调用函数得到的。
如果编译器能够使用RVO(返回值优化),那么myFunc
将返回给调用函数,而不是副本。在这种情况下,将不会调用复制构造函数。
您不必在C++上编写CC。编译器应该给你一个。是的,在这种情况下会调用CC,因为您试图将返回值作为副本传递。
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 构造函数/函数声明参数列表中的统一初始化
- 在c++中为链接列表创建复制构造函数/函数
- 如何声明模板函数,以便可以在类构造函数/函数中传递
- 在C 中,如何调用构造函数函数
- 在C++中构造模板函数时出现编译错误 C2664 和 C2440
- Rcpp:构造模板函数
- 采用nulltpr_t的构造函数:函数定义不声明参数
- 使用基于模板的构造函数构造std::函数
- 构造函数:函数不接受3个参数
- 就地构造 std::函数目标
- 将字符串构造作为函数参数传递
- C++:从模板化方法构造std::函数
- 构造std::函数的向量时出现编译器错误
- 构造<stl_hashtable>函数参数是否在
- libstdc++和libc++在用lambda构造std::函数时的不同行为
- 编译器构造-带有函数的类的c++sizeof()
- 使用 c++11 构造映射函数
- 调用构造与函数原型混淆
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参