有人可以从c ++类模板中解释以下代码段的语法吗?
public:
explicit Foo(size_t ratio = 500)
:list(Bar<I>())
,vec(Bar<iterator>())
,n(0), r(ratio){}
我在编程和理解大多数概念方面都有不错的经验,但这背后的语法对我来说太陌生,我无法理解。 I
是通用类型。具体来说,除了在执行某些代码(例如Foo<int> myfoo;
)时发生的事情,我不确定这里的显式内容是什么。
谢谢!
答案 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
等。