作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直认为C++中的隐式构造函数只能是一个只有一个参数的构造函数。例如:
class Foo1
{
Foo(int); // This could be an implicit constructor
};
但是下面的代码对吗:
class Foo2
{
Foo2(int, int=0); // Would compiler use this as an implicit constructor?
}
我能做到:
Foo1 obj;
...
obj = 5;
Foo2
呢?
最佳答案
首先,任何构造函数都可以标记为explicit
。它有多少参数是无关紧要的。
除此之外,您现在需要了解 explicit
的真正含义。这只是意味着调用构造函数的唯一方法是当您显式指定类名时:
struct foo
{
foo(int){}
explicit foo(double){}
};
void bar(foo){}
bar(5); // okay, calls foo(int) to construct the foo
bar(3.14); // error, cannot call foo(double) because foo was not explicitly used
bar(foo(3.14)); // okay, calls foo(double) to construct the foo
我们不显式标记多参数构造函数的原因是因为它没用。鉴于:
struct baz
{
baz(int, int, int);
};
除了说 baz
之外,您还能如何调用该构造函数? (如 baz(1, 2, 3)
。)†
在您的示例中,explicit
是明智的,因为您可以仅使用一个参数调用该构造函数。你实际做什么只取决于你是否认为它应该是隐式可转换的。
†这忽略了 C++11 初始化列表。在 C++11 中,我想你可以说:
void qaz(baz) {}
qaz({1, 2, 3});
并设法获得到多参数构造函数的隐式转换,但我对初始化列表的了解还不够多,除了作为脚注外,无法做出有意义的评论。
关于c++ - 隐式构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9304606/
我是一名优秀的程序员,十分优秀!