2010-03-22 137 views
1

我有两个拷贝构造函数拷贝构造函数的地址

Foo(Foo &obj){ 

} 
Foo(Foo *obj){ 

} 

当将第二拷贝构造函数将被调用?

+0

这是我的错误第二个不是复制构造函数 只是想知道什么时候第二个函数被调用? Foo foo3(&foo0);解决了它 – anish 2010-03-22 11:42:50

回答

5

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

Foo(Foo* obj);构造是单参数的构造 - 因为它没有被标有explicit关键字,它提供了从Foo*Foo的隐式转换。可以在任何时候调用Foo*代替Fooconst Foo&--如果意外调用它,几乎可以肯定发生了什么。

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

10

不,你没有 - 你有一个拷贝构造函数

Foo(Foo * obj); 

不是一个拷贝构造函数,绝不会由C++编译器可以用作这样的。你当然可以自己使用它:

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

还要注意你的真正的拷贝构造函数应该声明为;

Foo(const Foo & f); 

尽管缺乏const并不妨碍它成为拷贝构造函数。

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 
+0

您可以添加案例Foo * pfoo = new Foo; Foo foo4(pfoo); – 2010-03-22 12:53:38

2

你的一个构造函数是一个拷贝构造函数,另一种是只是一个普通的构造函数。如果显式初始化从一个指针一个FooFoo或者在从一个指针到Foo到的r值Foo的转换称为用于其它情况,如参数传递和函数返回

第二将被调用。

有这样的隐式转换通常是一个坏主意;当你不希望它是有可能把从编译错误琐碎错别字到不寻常的行为在运行时可能发生。