【问题标题】:What is "member initializer" in C++11?什么是 C++11 中的“成员初始值设定项”?
【发布时间】:2013-09-15 11:17:13
【问题描述】:

我遇到了一个名为“成员初始化器”的奇怪概念。

Here 说:

C++11 添加了成员​​初始化器,应用于成员的表达式 如果构造函数没有初始化成员本身,则在类范围内。

它的定义是什么?

有没有一些例子来说明它的用法?

【问题讨论】:

  • 点击那里的“C++11”链接,搜索“member i”,...,利润?

标签: c++ class c++11 member-initialization


【解决方案1】:

它可能是指类内成员初始化器。这允许您在声明点初始化非静态数据成员:

struct Foo
{
  explicit Foo(int i) : i(i) {} // x is initialized to 3.1416
  int i = 42;
  double x = 3.1416;
};

更多信息请关注Bjarne Stroustrup's C++11 FAQ

【讨论】:

    【解决方案2】:

    您现在可以在类中添加构造函数共享的初始化器:

    class A
    {
       int i = 42;
       int j = 1764;
    
    public:
       A() {} // i will be 42, j will be 1764
       A( int i ) : i(i) {} // j will be 1764
    };
    

    它避免了在构造函数中重复初始化器,对于大型类来说,这可能是一个真正的胜利。

    【讨论】:

      【解决方案3】:

      C++11 允许这样的非静态成员初始化:

      class C
      {
         int a = 2; /* This was not possible in pre-C++11 */
         int b;
      public:
         C(): b(5){}
      
      };
      

      【讨论】:

      • 我想知道我可以在private: 中创建int a = 2; int b;,而不是public
      • @BlackMamba 它已经在私有内部了。只有构造函数是公共的。
      • 对不起,我弄错了。因为默认访问标识符是private
      【解决方案4】:

      成员初始化器是指可以在类定义中设置的初始化器的扩展。例如,您可以使用

      struct foo
      {
           std::string bar = "hello";
           std::string baz{"world"};
           foo() {}                              // sets bar to "hello" and baz to "world"
           foo(std::string const& b): bar(b) {}  // sets bar to b and baz to "world"
      };
      

      如果成员初始化器列表没有给出另一个值,则将 bar 初始化为 hello。请注意,成员初始化器不限于内置类型。您还可以在成员初始化器列表中使用统一初始化语法。

      【讨论】:

        【解决方案5】:

        来自here:-

        非静态数据成员初始化器是一个相当简单的新 特征。事实上,GCC Bugzilla 揭示了新手 C++ 用户经常尝试 当语法非法时,在 C++98 中使用它!不得不说 Java 中也可以使用相同的功能,因此将其添加到 C++ 中 使用这两种语言的人的生活更轻松。

         struct A
          {
            int m;
            A() : m(7) { }
          };
        
          struct B
          {
            int m = 7;   // non-static data member initializer
          };
        thus the code:
        
          A a;
          B b;
        
          std::cout << a.m << '\n';
          std::cout << b.m << std::endl;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-21
          相关资源
          最近更新 更多