我了解具有一个(非默认)参数的构造函数的行为类似于隐式转换器,它将该参数类型转换为类类型。但是, explicit
可用于限定任何构造函数,那些没有参数(默认构造函数)或具有 2 个或更多(非默认)参数的构造函数。
为什么在这些构造函数上允许显式?有没有什么例子可以用来防止某种隐式转换?
原文由 Ashwin Nanjappa 发布,翻译遵循 CC BY-SA 4.0 许可协议
我了解具有一个(非默认)参数的构造函数的行为类似于隐式转换器,它将该参数类型转换为类类型。但是, explicit
可用于限定任何构造函数,那些没有参数(默认构造函数)或具有 2 个或更多(非默认)参数的构造函数。
为什么在这些构造函数上允许显式?有没有什么例子可以用来防止某种隐式转换?
原文由 Ashwin Nanjappa 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
一个原因当然是因为它不疼。
需要它的一个原因是,如果您有第一个参数的默认参数。构造函数成为默认构造函数,但仍可用作转换构造函数
C++0x 将它实际用于多参数构造函数。在 C++0x 中, 初始化列表 可用于初始化类对象。哲学是
如果您使用
= { ... }
,那么您使用一种“复合值”来初始化该对象,该“复合值”在概念上表示对象的抽象值,并且您希望转换为该类型。如果您使用
{ ... }
初始化程序,则直接调用对象的构造函数,不一定要指定转换。考虑这个例子
通过这种方式,C++0x 表明 C++03 允许显式其他构造函数的决定根本不是一个坏主意。