C++中关于类对象的初始化问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中关于类对象的初始化问题相关的知识,希望对你有一定的参考价值。
类中定义的其他类的对象没用到也要初始化吗?
初始化时必须用初始化列表吗?
初始化列表和直接赋值有什么本质区别?
是,初始化不是赋值,所以你想初始化而不是赋值的话就要用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 = 的调用,对于非内置类型来说,这就大大提高了对象的初始化效率。同样对于内置类型来说这没有什么大的不同,但为了保持一致性,通常最好的做法就是也把它们放在初始化成员列表中进行初始化。
另外 = 操作符所表示的意思也不总是赋值,在对象定义声明时使用操作符 = 对象调用的就是其复制构造函数而不是operator = :
int main()
A a(1000, "Stanly", "WestRoadNo.12345"), b;
b = a; // 这是operator =
A c = b; // 这是A(const A& _A)
参考技术A 不是
不是
不建议使用初始化列表
因为很多编译器在内部实现有差别 参考技术B 是
不是
本质没有什么区别吧,就运行的速度问题。。。
以上是关于C++中关于类对象的初始化问题的主要内容,如果未能解决你的问题,请参考以下文章