有哪些不同的初始化方法

时间:2015-03-04 18:22:30

标签: c++ variables initialization

有什么区别:

long long int flag=n-1; and long long int flag(n-1);

这些事情是否相同?我已经看到了后一段时间,但对此没有正确的认识。

3 个答案:

答案 0 :(得分:6)

long long int flag = n-1copy initialization。对于类类型,这仅考虑非显式构造函数和用户定义的转换。

long long int flag(n-1)direct initialization。这考虑了所有构造函数和用户定义的转换。

但是,这些差异仅对类类型有影响。对于基本类型,没有区别。

答案 1 :(得分:4)

严格来说,第一个被称为"复制初始化"第二个被称为"直接初始化"。对于原始类型,代码行为没有区别。

更多详细信息,请访问http://en.cppreference.com/w/cpp/language/initialization

答案 2 :(得分:0)

对于您列出的内置类型,没有区别。

但是如果你正在处理对象,那么第一个将调用赋值运算符,第二个将调用复制构造函数。

因此,如果您重载了赋值运算符和复制构造函数,那么

operator=(const Object& rhs)

将由第一个调用,

Object(const Object& rhs)

将被第二个调用。

重要的是要注意这一点,因为这些函数的行为方式不同。派生对象的复制构造函数将始终调用所有基础对象的构造函数。但是创建一个对象总是会自动调用它的构造函数,这也会自动调用基础构造函数。

因此,例如,如果您创建了一个对象然后分配它

Object o;
o = n - 1;

然后,您将调用对象的构造函数,其所有基础构造函数,然后调用其赋值运算符。这就是为什么通常最好使用对象的复制构造函数。对于内置类型,无所谓。