函数 f 在做什么?

Whats function f is doing?

提问人:Aniket Saha 提问时间:11/24/2019 最后编辑:CommunityAniket Saha 更新时间:11/25/2019 访问量:54

问:

下面是我试图弄清楚的代码。在我调用以下构造函数或函数之后,函数实际上在做什么?

我的问题是为什么我会得到这种输出,更具体地说,为什么“复制构造函数调用”被打印了 2 次。请解释这段代码的背景。

 class a {

    public:
        a() //default constructor
        {
            cout<<endl<<"default constructor called";
        }
        a(const a &o)// parameterized constructor
        {
            cout<<endl<<"Copy constructor called";
        }
        a f(a o)// function of some kind i'm not getting
        {
            return o;
        }
}

调用的构造函数和函数:

a (o1);

a o2(o1);

o1.f(o2); // correction : o2 as parameter in place of o1

输出:

称为默认构造函数

名为 Copy 构造函数

名为 Copy 构造函数

名为 Copy 构造函数

C++ default-constructor 构造函数重载

评论

1赞 ph3rin 11/24/2019
你是在问为什么你会得到这个输出吗?还是别的什么?请具体说明。
0赞 n314159 11/24/2019
该函数按值获取对象,因此在获取对象时进行复制。根据编译器是否执行复制省略(从 C++17 开始强制执行,以前非常普遍)或否,它会在返回时复制本地对象。因此,您将获得 1 到 2 个用于此函数的复制构造函数调用。(我认为通过高度优化,您的编译器甚至可以优化整个函数调用,并且您获得 0 个副本,但我不确定。fo1o
0赞 Peter 11/24/2019
按值传递副本,即调用复制构造函数。函数内部将 的副本返回给调用方,即复制构造函数的第二次调用。这是代码的基本逻辑,如下所示。在某些情况下,编译器可以省略其中的一个或多个副本(即不创建它们),但这不是(总是)必需的,而且显然不会发生在您的案例中。o1o1.f()return oo
0赞 Aniket Saha 11/25/2019
@Peter这个解释让我对代码有一定的了解......谢谢:)

答:

0赞 Ender_The_Xenocide 11/24/2019 #1

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

其他两个函数除了输出这些字符串外不执行任何操作。

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

评论

0赞 Aniket Saha 11/25/2019
朋友,我认为您错过了复制构造函数。