C++中关于类对象的初始化问题

来源:百度知道 编辑:UC知道 时间:2024/06/17 10:12:02
类中定义的其他类的对象没用到也要初始化吗?
初始化时必须用初始化列表吗?
初始化列表和直接赋值有什么本质区别?

你没用到你干嘛定义它?用得到的统统都需要初始化(既然定义了就当然用得到的了嘛......),否则其数据成员包含的就是垃圾。

是,初始化不是赋值,所以你想初始化而不是赋值的话就要用member initialization list而不是operator =。

区别:

clas A
{
public:
A();
A(int const _id, string const& _name, string const& _address);

private:

int id;
string name;
string address;

};

A::A(int const _id, string const& _name, string const& _address)
{
id = _id;
name = _name;
address = _address;
}

使用复制赋值操作符来“初始化”成员是所谓的“伪初始化”。在上面的过程中,在进入A()的函数体之前,name和address就已经分别调用了它们各自的默认构造函数一次,而在A()的函数体中它们又再次调用自己的operator = 来进行赋值。对内置类型来说则没有这个过程,所以对于内置类型,使用初始化成员列表或在构造函数体内对其进行赋值没什么大的区别。

A::A(int const _id, string const& _name, string const& _address)
: id(_id), name(_name), address(_address)
{
}

这一次name和address就只分别调用了它们各自的复制构造函数一次,而免去了多余了那一次对operator = 的调用,对于非内置类型来说,这就大大提高了对象的初始化效率。同样对于内置类型来说这没有什么大的不同,但为了保持一致性,通常最好的做法就是也把它们放在初始化成员列表中进行初始化。