有哪些不同的初始化方式
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-1
是 copy initialization。对于 class 类型,这仅考虑非显式构造函数和用户定义的转换。
long long int flag(n-1)
是 direct initialization。这考虑了所有构造函数和用户定义的转换。
但是,这些差异只对 class 类型有影响。对于基本类型,没有区别。
对于您列出的内置类型,没有区别。
但是如果你正在处理对象,那么第一个会调用赋值运算符,第二个会调用复制构造函数。
因此,如果您重载了赋值运算符和复制构造函数,那么
operator=(const Object& rhs)
会被第一个调用,
Object(const Object& rhs)
会被第二个调用。
请务必注意这一点,因为这些函数的行为方式不同。派生对象的复制构造函数将始终调用所有基础对象的构造函数。但是创建一个对象总是会自动调用它的构造函数,这也会自动调用基础构造函数。
因此,例如,如果您创建了一个对象然后将其赋值
Object o;
o = n - 1;
然后您将调用对象的构造函数、它的所有基本构造函数,然后是它的赋值运算符。这就是为什么通常最好为对象使用复制构造函数的原因。对于内置类型,这无关紧要。
有什么区别:
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-1
是 copy initialization。对于 class 类型,这仅考虑非显式构造函数和用户定义的转换。
long long int flag(n-1)
是 direct initialization。这考虑了所有构造函数和用户定义的转换。
但是,这些差异只对 class 类型有影响。对于基本类型,没有区别。
对于您列出的内置类型,没有区别。
但是如果你正在处理对象,那么第一个会调用赋值运算符,第二个会调用复制构造函数。
因此,如果您重载了赋值运算符和复制构造函数,那么
operator=(const Object& rhs)
会被第一个调用,
Object(const Object& rhs)
会被第二个调用。
请务必注意这一点,因为这些函数的行为方式不同。派生对象的复制构造函数将始终调用所有基础对象的构造函数。但是创建一个对象总是会自动调用它的构造函数,这也会自动调用基础构造函数。
因此,例如,如果您创建了一个对象然后将其赋值
Object o;
o = n - 1;
然后您将调用对象的构造函数、它的所有基本构造函数,然后是它的赋值运算符。这就是为什么通常最好为对象使用复制构造函数的原因。对于内置类型,这无关紧要。