标签:explicit c constructor explicit-constructor c-faq
显式关键字在C中的含义是什么?
解决方法:
允许编译器进行一次隐式转换以将参数解析为函数.这意味着编译器可以使用可用单个参数调用的构造函数从一种类型转换为另一种类型,以便为参数获取正确的类型.
这是一个带有构造函数的示例类,可用于隐式转换:
class Foo
{
public:
// single parameter constructor, can be used as an implicit conversion
Foo (int foo) : m_foo (foo)
{
}
int GetFoo () { return m_foo; }
private:
int m_foo;
};
这是一个采用Foo对象的简单函数:
void DoBar (Foo foo)
{
int i = foo.GetFoo ();
}
这里是调用DoBar函数的地方.
int main ()
{
DoBar (42);
}
参数不是Foo对象,而是int.但是,存在一个Foo的构造函数,它接受一个int,因此可以使用此构造函数将参数转换为正确的类型.
允许编译器为每个参数执行一次此操作.
将explicit关键字前缀到构造函数可防止编译器将该构造函数用于隐式转换.将它添加到上面的类将在函数调用DoBar(42)中创建编译器错误.现在需要使用DoBar明确调用转换(Foo(42))
您可能希望这样做的原因是为了避免可以隐藏错误的意外构造.举例:
>您有一个MyString(int size)类,其构造函数构造给定大小的字符串.你有一个函数print(const MyString&),你调用print(3)(当你打算调用print(“3”)时).你希望它打印“3”,但它打印一个长度为3的空字符串.
标签:explicit,c,constructor,explicit-constructor,c-faq 来源: https://codeday.me/bug/20190911/1802666.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。