关于c ++编码风格的简单问题,
例如,如果我们不做任何其他操作,将使用初始化列表中的默认构造函数调用类的所有成员变量。将调用B默认构造函数,并将value设置为0,int();class A
{
A();
private:
B b;
int value;
}
但是我的问题是,即使是默认构造函数也会被调用它是一个习惯,总是自己做,或者它只是为代码添加额外的行
A :: A():b(),value(){}
答案 0 :(得分:4)
你正在触及C ++的一个棘手角落。
对象中POD值的初始化是粘性的,取决于一些事情 即使我不确定我是否能够正确地遵守所有规则,但我相信@Steve Jessop曾经写过一篇关于SO的文章(虽然我现在可以找到它)。
但是有些例子:
此类将始终初始化为b == false和value = 0.
class A
{
A() : b(), value() {}
B b;
int value;
};
如果没有显式默认构造函数,则更复杂:
这里编译器将为您生成一个默认构造函数。但编译器生成默认构造函数的方式取决于具体情况。 编译器生成的默认构造函数可以执行两种不同形式的初始化,并且使用它取决于上下文:
示例:
class B
{
B b;
int value;
};
// Variables of static storage duration (notably globals)
// Will be zero initialized and thus b == false and value = 0
B global; // Initialized
int main()
{
// Object of automatic storage duration or dynamic storage duration
// These will depend on how they are declared.
// Value Initialization (POD re-mains undefined)
B bo1; // b/value undefined
B* bp1 = new B; // b.balue undefined
// Zero Initialization
B bo2 = B(); // b = false, value = 0
B* bp2 = new B(); // b = false, value = 0
// Note: The most obvious syntax for zero initializing a local object
// does not work as it is actually interpreted as a forward
// declaration of a function;
B bo3();
}
答案 1 :(得分:2)
保留默认构造函数是个好主意。编译器生成的构造函数比编写自己的版本更加可靠和可维护,除了其他任何东西之外,编写编译器可以为您编写的代码完全浪费时间。如果您不需要任何构造逻辑,那么不要编写构造函数。
但是,除非你这样做,否则int
不会被初始化,这是必须编写构造函数的一个很糟糕的理由。
答案 2 :(得分:1)
默认情况下,int变量没有用值初始化 - 你必须自己做。
因此,当您未在构造函数中将成员变量“value”设置为某个值时,它将保持未初始化状态。
答案 3 :(得分:1)
默认构造函数仅针对具有默认构造函数的类类型调用,而不是针对基元。