1

我有两个复制构造函数

Foo(Foo &obj){

}
Foo(Foo *obj){

}

什么时候会调用第二个复制构造函数?

4

4 回答 4

10

不,你没有 - 你有一个复制构造函数

Foo( Foo * obj );

不是复制构造函数,并且永远不会被 C++ 编译器这样使用。你当然可以自己使用它:

Foo a;
Foo b( & a );   // use your constructor

另请注意,您的真实复制构造函数应声明为;

Foo( const Foo & f );

尽管缺少 const 并不能阻止它成为复制构造函数。

于 2010-03-22T11:30:42.523 回答
5

撇开第二个构造函数不是复制构造函数不谈——您实际上想知道何时调用第二个构造函数。

构造Foo(Foo* obj);函数是一个单参数构造函数——因为它没有用关键字标记,它提供了从toexplicit的隐式转换。在使用 a 代替 a 的任何时候都可以调用它,或者- 如果它被意外调用,那几乎可以肯定是正在发生的事情。Foo*FooFoo*Fooconst Foo&

通常,单参数构造函数应该是复制构造函数(其他答案已经解释过)或者应该被标记explicit。应谨慎使用提供隐式转换的构造函数。

于 2010-03-22T12:03:31.833 回答
2

第二个不是复制构造函数。它是一个构造函数,当您创建一个新的 Foo 对象时会调用它,并提供一个指向 Foo 的指针作为参数。

Foo foo0;
Foo foo1 = foo0;  // Calls copy constructor
Foo foo2(foo0);   // Calls copy constructor
Foo foo3(&foo0);  // Calls constructor taking a pointer as parameter
于 2010-03-22T11:33:11.237 回答
2

您的构造函数之一是复制构造函数,另一个只是普通构造函数。

Foo如果您从指向的指针显式初始化 aFoo或在其他情况下调用从指向的指针到Foor 值的转换Foo,例如参数传递和函数返回,则将调用第二个。

进行这种隐式转换通常是个坏主意。当您不期望它发生时,它可能会发生,并且可能会在运行时将编译错误中的琐碎拼写错误转变为异常行为。

于 2010-03-22T11:33:23.110 回答