0

有人可以从 c++ 类模板中解释以下代码段的语法吗?

public:
explicit Foo(size_t ratio = 500)
    :list(Bar<I>())
    ,vec(Bar<iterator>())
    ,n(0), r(ratio){}

我有良好的编程经验并且理解大多数概念,但是这背后的语法对我来说太陌生了,我无法理解。I是泛型类型。具体来说,我不确定显式在这里做了什么,除了当人们执行一些代码时会发生什么,例如Foo<int> myfoo;.

谢谢!

4

3 回答 3

4

explicit关键字确保您的构造函数不会被选为用户定义的转换序列的一部分,以在使用 type 的值进行复制初始化时执行隐式转换size_t

例如,如果没有explicit关键字,以下所有内容都是有效的:

Foo<int> bar(Foo<int> f) 
{ 
    return 0; // OK
}

Foo<int> f = 1729; // OK
bar(42); // OK

将构造函数声明为explicit可防止上面的初始化编译。


构造函数签名之后是一个初始化列表,它用于在进入构造函数的主体之前构造类的基类子对象和数据成员子对象。

当您使用初始化列表时,您的类的数据成员是默认构造的。但是,如果您的类具有const数据成员、引用类型的数据成员或没有默认构造函数的类类型的数据成员,则这可能不是一个选项。

于 2013-03-28T21:16:00.597 回答
1

这是 class 的构造函数Foo,但我相信你已经知道了。

explicit表示此构造函数必须接收size_t. 也就是说,不能传入任何会被隐式转换为类型的东西size_t(例如:) int

其余的东西是构造函数的一部分initializer list,这意味着构造函数listBar<I>()等初始化数据成员。

于 2013-03-28T21:15:48.970 回答
0

这是构造函数的定义Foo。构造函数是explicit,这意味着它不会参与隐式转换。例如,考虑:

void bar(Foo);
bar(10); // Error - would require an implicit conversion

将构造函数标记为explicit可防止此类转换。

之后的所有:内容都是成员初始化列表。它按名称列出 的成员,Foo括号中包含用于初始化它们的表达式。例如,list将使用创建的临时对象进行初始化,使用 进行Bar<I>()初始化n0

于 2013-03-28T21:17:05.897 回答