c++中构造函数,初始化列表和直接赋值有什么区别吗?

2024-12-22 21:21:34
推荐回答(4个)
回答1:

初始化和赋值对内置类型的成员没有什么大的区别,像任一个构造函数都可以。但有的时候必须用带有初始化列表的构造函数:
(1) 成员类型是没有默认构造函数的类。若没有提供显式初始化时,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。

(2) const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。

还有一个赋值次数,效率上的区别,初始化参数列表在对象初始化时对成员变量赋值一次,构造函数内直接赋值,对成员变量赋值两次,一次是对象构造是用默认值进行赋值,第二次是调用构造函数赋值

回答2:

初始化和赋值对内置类型的成员没有什么大的区别。
像任一个构造函数都可以。但下列情况必须用带有初始化列表的构造函数:
(1) 成员类型是没有默认构造函数的类。若没有提供显式初始化时,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
(2) const成员或引用类型的成员。因为const对象或引用类型只能初始化,不能对他们赋值。
注意:还有一个赋值次数,效率上的区别,初始化参数列表在对象初始化时对成员变量赋值一次,构造函数内直接赋值,对成员变量赋值两次,一次是对象构造是用默认值进行赋值,第二次是调用构造函数赋值

回答3:

C++新手关注的一个常见问题是使用初始化表和在构造函数内使用数据成员的赋值之
间有什么区别例如以下代码
inline Account::
Account( const char *name, double opening_bal )
: _name( name ), _balance( opening_bal )
{
_acct_nmbr = get_unique_acct_nmbr();
}

inline Account::
Account( const char *name, double opening_bal )
{
_name = name;
_balance = opening_bal;
_acct_nmbr = get_unique_acct_nmbr();
}
它们的区别是什么
两种实现的最终结果是一样的在两个构造函数调用的结束处三个成员都含有相同的
值区别是成员初始化表只提供该类数据成员的初始化在构造函数体内对数据成员设置值
是一个赋值操作区别的重要性取决于数据成员的类型。如果对于内置类型和或者复合类型的话,效率上没有多大的差别,但对于非内置类型的话还是很明显的。如果属于类的组合的情况下,用初始化列表的话只需调用一次拷贝构造函数,而在构造函数内进行对象的赋值操作的话,会先调用缺省构造函数一次,再调用operator=赋值函数一次,由此可见效率的差别

回答4:

有很大的区别
请参考《c++ primer》