请解释一下这个c ++语法

时间:2013-03-28 21:12:35

标签: c++ syntax

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

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

我在编程和理解大多数概念方面都有不错的经验,但这背后的语法对我来说太陌生,我无法理解。 I是通用类型。具体来说,除了在执行某些代码(例如Foo<int> myfoo;)时发生的事情,我不确定这里的显式内容是什么。

谢谢!

3 个答案:

答案 0 :(得分:4)

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

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

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

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

将构造函数声明为explicit会阻止上面的初始化进行编译。


构造函数的签名后面是initialization list,它用于在输入构造函数体之前构造类的基类子对象和数据成员子对象。

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

答案 1 :(得分:1)

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

explicit表示此构造函数必须接收size_t的参数。也就是说,无法传递任何隐式转换为类型size_t的内容(例如:int)。

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

答案 2 :(得分:0)

这是Foo的构造函数的定义。构造函数是explicit,这意味着它不会涉及隐式转换。举个例子来考虑:

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

将构造函数标记为explicit会阻止此类转换。

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