C++ 函数f在做什么?

C++ 函数f在做什么?,c++,constructor,copy-constructor,default-constructor,constructor-overloading,C++,Constructor,Copy Constructor,Default Constructor,Constructor Overloading,下面是我想弄明白的代码。在调用以下构造函数或函数之后,函数实际上在做什么 我的问题是为什么我会得到这种输出,更具体地说,为什么“copyconstructor called”会被打印两次。请解释这段代码的背景是什么 a类{ 公众: a()//默认构造函数 { cout我相信f接受类型为a的对象,然后返回它,它对该对象没有任何作用,只是浪费时间 其他两个函数除了输出这些字符串之外什么都不做 o1.f(o1)只返回o1,实际上不在代码中执行任何操作,因为该值从未使用过。您是否询问为什么会获得此输出?

下面是我想弄明白的代码。在调用以下构造函数或函数之后,函数实际上在做什么

我的问题是为什么我会得到这种输出,更具体地说,为什么“copyconstructor called”会被打印两次。请解释这段代码的背景是什么

a类{
公众:
a()//默认构造函数
{

cout我相信f接受类型为a的对象,然后返回它,它对该对象没有任何作用,只是浪费时间

其他两个函数除了输出这些字符串之外什么都不做


o1.f(o1)只返回o1,实际上不在代码中执行任何操作,因为该值从未使用过。

您是否询问为什么会获得此输出?或其他什么?请指定。函数
f
按值获取对象,因此在获取对象时复制
o1
。这取决于编译器是否执行此操作(自C++17以来是强制性的,以前非常普遍。)或者,它在返回时复制本地对象
o
。因此,该函数可以得到1到2个副本构造函数调用。(我认为,如果进行高度优化,您的编译器甚至可以优化整个函数调用,您可以得到0个副本,但我不确定。)通过值将
o1
传递到
o1.f()
传递副本,即调用副本构造函数。函数中的
return o
o
的副本返回给调用者,即复制构造函数的第二次调用。这是代码的基本逻辑,如图所示。在某些情况下,编译器可以省略一个或多个副本(即不创建副本)但这并不是(总是)必需的,显然在你的情况下也不会发生。@Peter这个解释让我对代码有了一些理解……谢谢:)朋友,我想你错过了复制构造函数。