回答
撇开第二个构造函数不是复制构造函数 - 你实际上想知道何时会调用第二个构造函数。
的Foo(Foo* obj);
构造是单参数的构造 - 因为它没有被标有explicit
关键字,它提供了从Foo*
到Foo
的隐式转换。可以在任何时候调用Foo*
代替Foo
或const Foo&
--如果意外调用它,几乎可以肯定发生了什么。
一般来说,单参数构造函数应该是复制构造函数(其他答案已经解释过)或者应该标记为explicit
。它们提供隐式转换的构造应谨慎使用。
不,你没有 - 你有一个拷贝构造函数
Foo(Foo * obj);
不是一个拷贝构造函数,绝不会由C++编译器可以用作这样的。你当然可以自己使用它:
Foo a;
Foo b(& a); // use your constructor
还要注意你的真正的拷贝构造函数应该声明为;
Foo(const Foo & f);
尽管缺乏const并不妨碍它成为拷贝构造函数。
第二个是不是一个拷贝构造函数。这是一个当你创建一个新的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 * pfoo = new Foo; Foo foo4(pfoo); – 2010-03-22 12:53:38
你的一个构造函数是一个拷贝构造函数,另一种是只是一个普通的构造函数。如果显式初始化从一个指针一个Foo
到Foo
或者在从一个指针到Foo
到的r值Foo
的转换称为用于其它情况,如参数传递和函数返回
第二将被调用。
有这样的隐式转换通常是一个坏主意;当你不希望它是有可能把从编译错误琐碎错别字到不寻常的行为在运行时可能发生。
- 1. 的拷贝构造函数
- 2. 拷贝构造函数knowlege
- 3. 拷贝构造函数++
- 4. D结构体拷贝构造函数
- 5. Java的ArrayList的拷贝构造函数
- 6. 拷贝赋值为未实现的拷贝构造函数
- 7. C++中的拷贝构造函数
- 8. 基类的拷贝构造函数(C++)
- 9. Java的拷贝构造函数
- 10. 拷贝构造函数的区别?
- 11. 错误的拷贝构造函数
- 12. 新图的深拷贝构造函数
- 13. Java ArrayList的拷贝构造函数是浅拷贝还是深拷贝?
- 14. 移动构造函数和非常拷贝构造函数
- 15. 拷贝构造函数不叫
- 16. 拷贝构造函数在C++
- 17. 私人拷贝构造函数:disallow
- 18. 堆栈拷贝构造函数
- 19. 通用C#拷贝构造函数
- 20. c#拷贝构造函数生成器
- 21. 避免向量拷贝构造函数
- 22. 模板拷贝构造函数
- 23. C#泛型拷贝构造函数
- 24. C++默认拷贝构造函数
- 25. C++拷贝构造函数语法
- 26. C++ std :: auto_ptr拷贝构造函数
- 27. 一个拷贝构造函数调用
- 28. 段错误拷贝构造函数
- 29. 指针和拷贝构造函数C++
- 30. 拷贝构造函数不被调用?
这是我的错误第二个不是复制构造函数 只是想知道什么时候第二个函数被调用? Foo foo3(&foo0);解决了它 – anish 2010-03-22 11:42:50