奇怪的构造函数行为
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 时,编译器会调用复制构造函数将对象 f1
或 f2
复制到 f
中。
为避免这种情况,只需将函数的引用参数声明为 Foo 对象,如下所示:
int someFunction(Foo &f) {}
然后照常调用:
someFunction(f1);
#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 时,编译器会调用复制构造函数将对象 f1
或 f2
复制到 f
中。
为避免这种情况,只需将函数的引用参数声明为 Foo 对象,如下所示:
int someFunction(Foo &f) {}
然后照常调用:
someFunction(f1);