如何将基类子对象的成员初始化为0?

3
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类。为什么? - Karl Knechtel
5个回答

8

尝试

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

A() 值初始化 A,由于 A 是一个 POD 类型,因此成员将被默认(零)初始化。



1
@Kristopher和@schnaader:请查看ISO C++03的第8.5/5节。 - Prasoon Saurav
2
好的,我现在理解得更清楚了。我想重要的一段是这句话:“一个初始化程序为一个空括号集合(即())的对象将被值初始化”。 - schnaader
2
我记得这是C++03和C++0X之间的变化。而且g++ 4.4.4不会将成员设置为0。 - AProgrammer
1
你的答案在 GNU 4.3.2 上无效,顺便说一下。我已经测试过了。 - CashCow
1
@CashCow:在gnu 4.3.2中,似乎未正确实现值初始化。该解决方案在g++ 4.5、clang++和IntelC++ 11.0上运行良好。 - Prasoon Saurav
显示剩余8条评论

4

我进行了测试,因为我认为它可能会起作用(即使没有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 Saurav
@Prasoon:无论如何,这是一个很好的答案,因为它表明有编译器不起作用。不过知道使用了哪个编译器会更好。 - schnaader
@Prasoon 我最初的反应与你的解决方案相同,尽管在实际世界中,除非你只为自己的编译器编写代码,否则你要编写适用于一些旧编译器的代码。你可以加入一个预处理器,即 #if _GNUC_VERSION > 4.5 或其他。 - CashCow

1

也许我漏掉了什么,但这个怎么样?

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

1

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

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

   }

};

1
当然,正确的方法是让A的构造函数初始化它的成员。否则,由于这些成员不是私有的,你可以在B的构造函数中为它们赋值。
a = 0;

等等,实际上是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接