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++中关于类对象的初始化问题的主要内容,如果未能解决你的问题,请参考以下文章

java中关于对象初始化的问题

java中关于创建对象,初始化和给类赋值的问题。

Python语言及其运用_第六章_对象和类

c++中关于私有静态变量的问题

c++类继承,标识符未定义

[python] 在 python2和3中关于类继承的 super方法简要说明