我过去几天一直在学习C ++,我看到两种格式,我无法确定这两种格式的优缺点。希望有人可以帮助我。
第一个变量用 var(value)
class Foo
{
public:
Foo(): itsVar1(2), itsVar2(345){}
private:
int itsVar1;
int itsVar2;
};
第二个是使用赋值运算符 var = value
初始化的。
class Foo
{
public:
Foo()
{
itsVar1 = 2;
itsVar2 = 345;
}
private:
int itsVar1;
int itsVar2;
};
一方面有优势吗?这是个人偏好吗? 第一种风格(?)看起来让我更加困惑。看起来你正在调用一个方法并传入该值。看起来很含蓄;然而,第二个是非常明确的,因为来自Python的人“明显比隐含更好”我更喜欢第二种方法。我错过了什么?
答案 0 :(得分:3)
前一种表示法将在构造函数调用之前初始化成员。在初始化之前,在构造函数内部不会执行任何操作。如果存在继承,则在当前构造函数调用之前将调用父类的构造函数。
同样,我认为构造函数的显式和隐式声明在c ++中与python不同。当构造函数只有一个参数不是类本身的类型(构造函数不是复制构造函数)时,它可以用于类型转换。当您将显式放在构造函数的名称之前时,如果没有我的明确许可,您就告诉编译器没有转换任何内容。
答案 1 :(得分:2)
始终使用初始化列表(第一种样式)。这样做的主要原因是:
不使用初始化列表会更难保证异常安全。使用RAII类作为类成员变量以及初始化列表,可以保证构造函数在面对成员变量构造函数抛出的异常时不会泄漏资源。
分配的效果并不比初始化程序列表好。如果成员变量类型不重要,那么分配实际上会更糟糕。使用初始化程序,将构建成员变量,并且不会发生默认构造。使用赋值可以使所有成员变量首先成为默认构造。
初始化列表是为引用和const成员变量赋值的唯一方法。
答案 2 :(得分:0)
当构造函数声明为
时 Foo(): itsVar1(2), itsVar2(345){}
这意味着变量“itsVar1”“和itsVar2”在创建其局部变量成员(即itsVar和itsVar2)时被初始化。这种初始化方法称为初始化列表。在用户定义类型的情况下,这样的初始化将调用用户定义类型的复制构造函数。更多信息:http://en.wikipedia.org/wiki/Initialization_(programming)#Initializer_list
当构造函数定义为
时 Foo()
{
itsVar1 = 2;
itsVar2 = 345;
}
构造函数创建内存并且不初始化成员变量itsVar1和itsVar2。 一旦创建了成员并且控件流入构造函数的主体,它们就会被赋值。
使用初始化程序列表的优点是成员变量不会被调用两次(一次在创建期间,另一次在赋值时)。成员变量的创建和初始化同时发生。如果初始化列表中有许多变量,那么在调用构造函数时会比其他方法获得轻微的性能优势。