【问题标题】:How to initialize members of the base class subobject to 0?如何将基类子对象的成员初始化为0?
【发布时间】:2011-07-10 11:55:13
【问题描述】:
class A
{
  public: int a,b,c;
};

class B: public A
{
   public: int d;
   B():d(0){} // Some hackery needed here
};

int main()
{
   B obj;
   std::cout<< obj.a << std::endl; // garbage
   std::cout<< obj.b << std::endl; // garbage
   std::cout<< obj.c << std::endl; // garbage
   std::cout<< obj.d << std::endl; // 0
}

如何将子对象数据成员 a、b 和 c 初始化为 0?我不允许修改 A 类。

【问题讨论】:

  • "我不允许修改 A 类。"为什么不呢?

标签: c++ inheritance object


【解决方案1】:

试试

B() : A() , d(0){}

A() 值初始化 A,并且由于 A 是 POD,因此成员将被默认(零)初始化


【讨论】:

  • @Prasoon:有些人只是来投反对票,不知道自己在做什么,甚至不发表评论!
  • @Kristopher 和 @schnaader:查看第 8.5/5 节 ISO C++03
  • 好的,我现在理解得更好了。我想重要的一段是:“初始化器是一组空括号的对象,即 (),应进行值初始化”
  • ISTR 认为这是 C++03 和 C++0X 之间的变化。而且 g++ 4.4.4 没有将成员设置为 0。
  • 顺便说一句,您的答案在 gnu 4.3.2 上不起作用。我测试过了。
【解决方案2】:

我对此进行了测试,因为我认为它可能有效(即使没有 Prasoon 的回答)

B::B() : A(), d(0)
{
}

可能会起作用,因为您正在“初始化”A。

顺便说一句,它没有。输出: 1,32,123595988

这会起作用:

// put this in B.cpp anonymous namespace
const A a_init = { 0, 0 ,0 };

接着是:

B::B() : A( a_init), d(0)
{
}

我正在使用 g++ 4.3.2 进行测试。现在工作了:

B::B() : A(A()), d(0)
{
}

【讨论】:

  • 在已正确实现值初始化的编译器上试一试 :)
  • @Prasoon:无论如何,这是一个很好的答案,因为它表明有些编译器不起作用。不过,最好知道使用了哪个编译器。
  • @Prasoon 我最初的反应是和你一样的解决方案,尽管在实际世界中,除非你只为你唯一的编译器编写代码,否则你编写的代码也适用于一些旧的编译器。您可以放入预处理器,即 #if _GNUC_VERSION > 4.5 或其他
【解决方案3】:

也许我错过了什么,但是这个怎么样?

class B: public A
{
    public: int d;
    B():d(0){a=b=c=0;}
}

【讨论】:

    【解决方案4】:

    如下所示声明派生类构造函数

    class B: public A
    {
       public: int d;
       B():a(0),b(0),c(0),d(0)
       {
    
       }
    
    };
    

    【讨论】:

      【解决方案5】:

      正确的方法当然是让 A 的构造函数初始化它的成员。否则,由于成员不是私有的,您可以从 B 构造函数内部为它们分配值。

      a = 0;
      

      等等,确实有效。

      【讨论】:

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