我有两个复制构造函数
Foo(Foo &obj){
}
Foo(Foo *obj){
}
什么时候会调用第二个复制构造函数?
我有两个复制构造函数
Foo(Foo &obj){
}
Foo(Foo *obj){
}
什么时候会调用第二个复制构造函数?
不,你没有 - 你有一个复制构造函数
Foo( Foo * obj );
不是复制构造函数,并且永远不会被 C++ 编译器这样使用。你当然可以自己使用它:
Foo a;
Foo b( & a ); // use your constructor
另请注意,您的真实复制构造函数应声明为;
Foo( const Foo & f );
尽管缺少 const 并不能阻止它成为复制构造函数。
撇开第二个构造函数不是复制构造函数不谈——您实际上想知道何时调用第二个构造函数。
构造Foo(Foo* obj);
函数是一个单参数构造函数——因为它没有用关键字标记,它提供了从toexplicit
的隐式转换。在使用 a 代替 a 的任何时候都可以调用它,或者- 如果它被意外调用,那几乎可以肯定是正在发生的事情。Foo*
Foo
Foo*
Foo
const Foo&
通常,单参数构造函数应该是复制构造函数(其他答案已经解释过)或者应该被标记explicit
。应谨慎使用提供隐式转换的构造函数。
第二个不是复制构造函数。它是一个构造函数,当您创建一个新的 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
您的构造函数之一是复制构造函数,另一个只是普通构造函数。
Foo
如果您从指向的指针显式初始化 aFoo
或在其他情况下调用从指向的指针到Foo
r 值的转换Foo
,例如参数传递和函数返回,则将调用第二个。
进行这种隐式转换通常是个坏主意。当您不期望它发生时,它可能会发生,并且可能会在运行时将编译错误中的琐碎拼写错误转变为异常行为。