当我在c ++工作时,我看到两种类型的ctor定义..分配值时有什么区别吗?他们中的一个有优势还是只是写作风格?
第一个ctor定义:
f.isFavorite(!f.isFavorite());
第二个ctor定义:
class X
{
public:
X(int val):val_(val){}
private:
int val_;
};
答案 0 :(得分:3)
技术上是的,尽管您通常不会发现int
等内置类型的任何差异。
不同之处在于,您的第一个代码段复制构造val_
来自val
,而第二个默认构建val_
,然后将val
分配给它。正如我上面所说,这通常只适用于构造函数确实有效的更复杂类型。
一个证明差异的简单例子是
class X
{
public:
X(int val):val_(val){}
private:
const int val_;
};
编译vs。
class X
{
public:
X(int val)
{
val_ = val;
}
private:
const int val_;
};
没有。
答案 1 :(得分:1)
是的,有区别。在构造函数初始值设定项列表中,构造成员变量,而构造函数体中的赋值是已构造变量的赋值。
对于int
或float
等基本类型,它没有实际的区别。
答案 2 :(得分:0)
在您的示例中,没有区别。由于您的成员是int
,因此这两个陈述具有相同的效果。
如果你的成员变量是一个对象,第一个表单会更好,因为它只是调用对象类的构造函数,而第二个表单将通过使用默认构造函数创建一个对象,然后创建另一个,存储它进入临时,在第一个对象上调用析构函数,将临时文件复制到你的成员变量中,再次在第二个对象上调用析构函数。