有哪些不同的初始化方式

What are different ways of initialization

有什么区别:

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

这些东西是一样的吗?后两回我也看过,但不是很清楚

严格来说,第一个叫"copy initialization",第二个叫"direct initialization"。对于基本类型,代码行为没有区别。

可以在 http://en.cppreference.com/w/cpp/language/initialization 找到更多详细信息。

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

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

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

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

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

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

operator=(const Object& rhs)

会被第一个调用,

Object(const Object& rhs)

会被第二个调用。

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

因此,例如,如果您创建了一个对象然后将其赋值

Object o;
o = n - 1;

然后您将调用对象的构造函数、它的所有基本构造函数,然后是它的赋值运算符。这就是为什么通常最好为对象使用复制构造函数的原因。对于内置类型,这无关紧要。