在设计公共API时,将构造函数设置为显式是一种好的做法吗?
class A {
public:
//explicit A(int i){}
A(int i){}
};
void fun(const A& a) {}
int main() {
// If I use explicit for A constructor, I can prevent this mistake.
// (Or shall I call it as feature?)
fun(10);
}
Run Code Online (Sandbox Code Playgroud)
或者我应该允许隐式转换,以允许用户以较少的输入调用我的API?
构造函数应该是显式的,除非隐式转换在语义上有意义(例如,将转换int为A?的含义是什么).减少打字不应成为指导该决定的标准.考虑可读性(这是隐式转换的主要参数)以及代码的理解程度.一个不直观的隐式演员会让代码的读者抓住他们的头脑.
PS:我现在似乎无法想出一个很好的例子,所以任何帮助都会受到赞赏.
是的,默认情况下,任何可以使用一个参数调用的构造函数都应该是显式的.遵循这条规则将避免微妙的错误,这是很难找到的.
当然,这条规则有例外:
如果您的类具有围绕一个参数类型的包装器的语义,则可能需要隐式转换.
复制构造函数不应该是显式的(否则你会失去传值调用的可能性).
| 归档时间: |
|
| 查看次数: |
802 次 |
| 最近记录: |