你好,我有一个问题很久以前就找不到答案了。那就是以下两个语句关于参数初始化的区别是什么?
class A::A()
: a(0), b(0), c(0)
{
}
class A::A()
{
a = 0
b = 0;
c = 0;
}
我知道有"直接初始化"和"复制初始化",但我不知道其他的区别,而且第一个陈述是否有任何描述?
先谢谢了。
你好,我有一个问题很久以前就找不到答案了。那就是以下两个语句关于参数初始化的区别是什么?
class A::A()
: a(0), b(0), c(0)
{
}
class A::A()
{
a = 0
b = 0;
c = 0;
}
我知道有"直接初始化"和"复制初始化",但我不知道其他的区别,而且第一个陈述是否有任何描述?
先谢谢了。
class Example {
int a, b, c;
Example() : a(1), c(2), b(c) {}
}
由于b
在c
之前被初始化,因此产生了未定义行为,其值未定义。为避免混淆和潜在的这种微妙错误,请始终按照类中声明成员的顺序在初始化列表中列出它们。
起初可能看起来有些晦涩,但其中存在一个原因。在C++中,保证按照创建顺序的完全相反顺序销毁类的所有成员。现在,类可以具有多个构造函数,每个构造函数都有自己的初始化列表,并且(不幸的是,有人可能会说)初始化列表可以按程序员想要的任何方式排序。如果初始化列表的顺序决定了实际的初始化顺序,则运行时应该以某种方式维护有关每个对象的数据,以记住它创建时使用的构造函数以及成员应该销毁的顺序。这将增加运行时开销,而没有明显的好处,因此 - 符合一般C++哲学的“只为所用付费”-决定初始化顺序一劳永逸地由声明顺序定义。
C():aConst(0){aConst = theRealValue;}
这样的代码 :-) - Péter Török默认初始化列表的目的是用于在类内初始化常量变量。 因为常量变量在对象初始化之前就被初始化了。
我提供一个示例来解释这两种初始化之间的区别:
class A
{
private:
const int x;
};
A::A():x(5) //this code works fine
{
}
A::A() //this code is wrong.const variable is not initialized once object
{
x=5;
}
主要的区别在于,第一种情况下类成员是被初始化的,而在第二种情况下它们是被赋值的。对于非整数类型,这意味着在第二种情况下你会使用operator=
来为你的类成员赋值。
通常情况下,更倾向于使用第一种情况,因为在这种情况下,类成员是在构造函数体之前被初始化。
此外,在某些情况下不能使用赋值操作,例如当类成员被声明为const时。
=
既不是“直接初始化”也不是“复制初始化”,而是赋值。 - MSalters