2013-03-28 55 views
0

有人可以请解释从C++类模板的以下片段的语法?请解释这个c + +语法

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

我与编程体面的经验和理解大多数概念,但是这背后的语法就是这么国外对我来说,我无法理解。 I是通用类型。具体而言,我不确定这里显式的内容是什么,除了执行一些代码(例如Foo<int> myfoo;)时发生了什么。

谢谢!

+1

这回答什么是明确的很好:http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

+0

你需要[The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?rq=1)。请选择多个。 –

回答

1

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

explicit说这个构造函数必须接收一个参数size_t。也就是说,不能通过任何隐含地转换为类型size_t(例如:int)的任何内容。

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

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数据成员,或引用类型的数据成员,或者没有默认构造函数的类类型的数据成员,则这可能不是选项。

+0

现在,什么是':list','',',n(0),'和'r(ratio){}'?想写一本书吗? :-) –

+0

@BoPersson:没有人会发布它:) –

0

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

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

标记构造函数为explicit可以防止这种转换。

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