-
21-09-2019 - |
题
我有两个拷贝构造
Foo(Foo &obj){
}
Foo(Foo *obj){
}
在将第二个拷贝构造函数将被调用?
解决方案
撇开第二构造不是一个拷贝构造函数 - 你其实是想知道,当第二个构造将被称为的
在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 );
虽然缺乏常量的不防止它被一个拷贝构造。
在第二不是复制构造。这是一个当你创建一个新的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
或者在从一个指针到Foo
到的r值Foo
的转换称为用于其它情况下,例如作为参数传递和函数返回初始化Foo
调用。
它通常是一个坏主意,有这样的隐式转换;当你不希望它是有可能把从编译错误琐碎错别字成在运行时异常行为可能发生。
不隶属于 StackOverflow