![](/img/trans.png)
[英]Please explain this C++ syntax which seems to be incomplete or lacks assignment?
[英]please explain this c++ syntax
有人可以从 C++ 类模板中解释以下代码段的语法吗?
public:
explicit Foo(size_t ratio = 500)
:list(Bar<I>())
,vec(Bar<iterator>())
,n(0), r(ratio){}
我在编程方面有不错的经验并且理解大多数概念,但是这背后的语法对我来说太陌生了,我无法理解。 I
是泛型类型。 具体来说,除了执行诸如Foo<int> myfoo;
代码时会发生什么之外,我还不确定显式在这里做了什么Foo<int> myfoo;
.
谢谢!
当使用size_t
类型的值进行复制初始化时, explicit
关键字确保您的构造函数不会被选择作为用户定义的转换序列的一部分来执行隐式转换。
例如,如果没有explicit
关键字,以下所有内容都是有效的:
Foo<int> bar(Foo<int> f)
{
return 0; // OK
}
Foo<int> f = 1729; // OK
bar(42); // OK
将构造函数声明为explicit
可防止上述初始化编译。
在构造函数的签名之后是一个初始化列表,它用于在进入构造函数的主体之前构造您的类的基类子对象和数据成员子对象。
当您不使用初始化列表时,您的类的数据成员是默认构造的。 但是,如果您的类具有const
数据成员、引用类型的数据成员或没有默认构造函数的类类型的数据成员,则这可能不是一个选项。
这是Foo
类的构造函数,但我相信您已经知道了。
explicit
表示此构造函数必须接收一个size_t
参数。 也就是说,不能传入任何会隐式转换为size_t
类型(例如: int
)的内容。
其余的东西是构造函数的initializer list
,这意味着构造函数用Bar<I>()
等初始化数据成员list
。
这是Foo
构造函数的定义。 构造函数是explicit
,这意味着它不会参与隐式转换。 例如,考虑:
void bar(Foo);
bar(10); // Error - would require an implicit conversion
将构造函数标记为explicit
可防止此类转换。
:
之后的所有内容都是成员初始化列表。 它按名称列出Foo
的成员,括号中包含用于初始化它们的表达式。 例如, list
将使用Bar<I>()
创建的临时对象初始化, n
使用0
初始化,等等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.