【问题标题】:please explain this c++ syntax请解释这个 c++ 语法
【发布时间】:2013-03-19 12:09:40
【问题描述】:

有人可以从 c++ 类模板中解释以下 sn-p 的语法吗?

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

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

谢谢!

【问题讨论】:

标签: c++ syntax


【解决方案1】:

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

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

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

: 之后的所有内容都是成员初始化列表。它按名称列出Foo 的成员,括号中包含用于初始化它们的表达式。比如list会被Bar&lt;I&gt;()创建的临时对象初始化,n会被0初始化等等。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 现在,:listBar&lt;I&gt;,n(0),r(ratio){} 是什么?想写一本书? :-)
    • @BoPersson:没有人会发布它:)
    【解决方案3】:

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

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

    剩下的都是构造函数的initializer list的一部分,也就是说构造函数初始化数据成员listBar&lt;I&gt;()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多