读书人

读书感悟关于C++的初始化列表的疑义

发布时间: 2013-01-11 11:57:35 作者: rapoo

读书感悟,关于C++的初始化列表的疑问
本帖最后由 jackyjkchen 于 2010-04-25 21:44:04 编辑 C++的初始化列表相对于构造函数内赋值有效率优势,但仅限于类对象,对于内置类型没什么区别(梳理原话称之为“行为良好”),具体的在“深入详解C++对象模型中”有深入解释。

我个人不喜欢初始化列表的语法,而且最不解的就是“仅限于类对象,对于内置类型没什么区别”这一点,我感觉对于类来说,最有初始化价值的就是内置类型,而类成员对象,在构造的时候本身就会自动调用他本身构造函数啊,感觉没有初始化的绝对必要啊,这一点是不是C++引入的又一个比较蛋疼的复杂性呢?

确实这种方式能够增加灵活度,比如你可以在初始化列表中调用非默认的构造函数并赋任意值,但是C#和java里印象中没这东西吧,而且C++还把这里弄得像个陷阱似的——类对象如果在构造函数中初始化,效率会降低。

MFC里会给CString的控件关联变量自动加上初始化列表,我就直接会删掉,因为CString根本不需要初始化……而且初始化列表和静态类型还不兼容,有时候多线程调用还麻烦(当然,我避免静态数据,一般用传入this到线程的方法)。
[解决办法]
问题呢?为什么我没看到
[解决办法]
这个取决于个人风格吧,对内置类型写在里面外面效率都一样,用初始化列表看起来整齐点
[解决办法]
帮顶。

[解决办法]
嗯 对类对象如果不用初始化列表的话,最少多了一次复制运算符的调用,这个开销在某些时候有些大。
[解决办法]
如果一个类没提供默认构造函数就得靠这个
如果类里面有const成员想要初始化也得靠这个

java里面有这两个需求吗

[解决办法]
有点乱~!
[解决办法]
我今天刚看了那一节,它的解释是在构造函数内部内置类型和在初始化列表中效率是一样的。对对象,如果写在构造函数类部,可能先调用这个成员对象的默认构造函数,然后再调用改成员对象的拷贝构造函数,如果只写在初始化列表中,直接调用具体的构造函数或拷贝构造,少了默认构造函数了。如果用指针,估计差别不大。
当然它这个讨论的是编译器可能的实现,不知道现在的编译器是如何做的。
[解决办法]
我个人不喜欢初始化列表的语法,而且最不解的就是“仅限于类对象,对于内置类型没什么区别”这一点,我感觉对于类来说,最有初始化价值的就是内置类型,而类成员对象,在构造的时候本身就会自动调用他本身构造函数啊,感觉没有初始化的绝对必要啊,这一点是不是C++引入的又一个比较蛋疼的复杂性呢?

首先初始化列表只能写在构造函数中,LZ红色部分让我觉得初始化列表不是构造函数的专利
其次对于指针类型的成员对象,不初始化就容易出现野指针。


[解决办法]
如果构造函数抛异常怎么办啊
初始化列表无论怎么说都会在函数体之前
工作。即使构造函数抛异常,也可以完成初始化的工作。
个人觉得初始化列表有用,一点建议。
[解决办法]

引用:
引用:
我个人不喜欢初始化列表的语法,而且最不解的就是“仅限于类对象,对于内置类型没什么区别”这一点,我感觉对于类来说,最有初始化价值的就是内置类型,而类成员对象,在构造的时候本身就会自动调用他本身构造函数啊,感觉没有初始化的绝对必要啊,这一点是不是C++引入的又一个比较蛋疼的复杂性呢?

首先初始化列表只能写在构造函数中,LZ红色部分让我觉得初始化列表不……

UP
[解决办法]
学习学习
[解决办法]
我觉得初始化列表在一定时间是有必要的
具备这些条件时
1,直接从构造函数传递一个类对象过来
2,定义的不是指针类型,需要拷贝
2,此对象直接可用

如果这个时候,你不把它放在初始化列表,就有点可惜了
因为,会调用一次默认构造函数,再调用一次=重载

我引用 c++primer中的一段吧
The significance of this distinction depends on the type of the data
member.
Conceptually, it is important to think of the execution of a constructor as consisting of two phases: (1)
either an implicit or an explicit initialization phase and (2) a general computation phase. The computation
phase consists of all the statements within the body of the constructor. Any setting of data members
within the computation phase is treated as an assignment, not as an initialization. The failure
------解决方案--------------------


c++ primer plus里好像提到过如果不这麽做在某些情况下会出现难以发现的对象初始化错误,
[解决办法]
内置的如string就是系统已经有一切的构造函数,析构,。。。
而类类型,就是用户自己定义属于自己的数据类型,这当然包括其构造等。。
因此说对于类类型来说做初始化和必要的防出错定义是很必要的。这里说的初始化列表就是前者。否则会是随机值或编译没问题,但运行会莫名其妙。

读书人网 >C++

热点推荐