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