C++ 如何模仿Java';C+中的s类归零+;?

C++ 如何模仿Java';C+中的s类归零+;?,c++,C++,在C语言中,为了确保所有结构都归零,我使用以下代码包装malloc: void* safe_malloc(size_t size){ void *result = malloc(size); memset(result, 0, size); //NULL check ommitted for brevity return result; } 这样我就可以避免做: struct Foo { int bar; int bat; }; struct Foo

在C语言中,为了确保所有结构都归零,我使用以下代码包装
malloc

void* safe_malloc(size_t size){
    void *result = malloc(size);
    memset(result, 0, size); //NULL check ommitted for brevity
    return result;
}
这样我就可以避免做:

struct Foo {
    int bar;
    int bat;
};

struct Foo *tmp = malloc(sizeof(struct Foo));
tmp->bar = 0; 
tmp->bat = 0; // I want to avoid this laundry list of initializers
<>我想做类似C++的事情,我希望把所有的类成员都初始化为零,就像java中自动完成的一样。使用像C解决方案这样的解决方案会出现两个问题:1。无法清除vtable ptr和2。子类将清除继承的成员值

class Foo {
public:
    int bar;
    int bat;

    Foo(int bar){
        this->bar = bar;
        this->bat = 0; // I dont want to explicitly have to initialize this here
    }
}

class Baz : public Foo {
public:
    int bam;
    Baz(int bar, int bam) : Foo(bar) {
        this->bam = bam;
    }
}
如何避免洗衣单在C++中的等价性?

  • 比起malloc+memset,更喜欢calloc
  • 要将对象归零,请明智地选择构造函数
  • 您可以重载新运算符以返回归零内存。(根据您的要求为类或全局重载new)此重载new应将分配的字节归零

  • 您可以省去一些麻烦,使用calloc()而不是safe_malloc()。您应该使用成员初始化语法而不是任何语法,例如:bar(0),bat(0)。@EJP注意到,但是
    safe\u malloc
    实际上在
    malloc
    返回
    NULL
    的显式情况下做得更多,这与问题无关。构造函数不应该正是负责默认初始化类类型的数据成员的方法吗?为什么这对你来说很重要?你只需要在ctor中做一次,而不是每次创建一个类对象。为什么要花费额外的精力来掩盖潜在的bug呢?如果有什么东西,用0xDead牛肉或类似的模式填充内存。至少在C++世界里,在使用之前不能初始化一个字段是一个严重的错误。它会使应用程序崩溃。但这只会在调试时发生一次。然后你会发现问题并解决它。如果你总是在构造函数中这样做,那么只有一个地方需要修复。用户永远不会遇到这样的错误,应用程序也永远不会崩溃。默认初始化所有成员只是为了隐藏bug,而不是帮助使用它们。