奇怪的构造函数行为

Weird constructors behavior

#include <iostream>
using namespace std;

class Foo
{
public:
    Foo()
    {
        cout << 0;
    }
    Foo(Foo &f)
    {
        cout << 1;
    }
};

void someFunction(Foo f) {};

int main()
{
    Foo f1;           //displays 0 (as expected)
    Foo f2(f1);       //displays 1 (as expected)
    someFunction(f1); //displays 1 (why?)
    someFunction(f2); //displays 1 (why?)

    return 0;
}

我不明白为什么函数 'someFunction' 调用第二个构造函数。我认为它只会调用第一个构造函数,没有参数,并显示 0.

也许我遗漏了一些明显的东西...

第二个构造函数是 copy 构造函数,当您按值将参数传递给函数时,它是 copied,它调用复制构造函数。

第一个构造函数(默认构造函数)仅在从头开始创建对象时调用,并且不带任何参数。

它永远不会调用默认构造函数,因为您只是在复制 foo 对象。它将使用复制构造函数,如果没有可用的复制构造函数,它将使用与此类似的第二个。

因为当你调用 someFunction 时,编译器会调用复制构造函数将对象 f1f2 复制到 f 中。

为避免这种情况,只需将函数的引用参数声明为 Foo 对象,如下所示:

int someFunction(Foo &f) {}

然后照常调用:

someFunction(f1);