读书感悟,关于C++的初始化列表的疑问
本帖最后由 jackyjkchen 于 2010-04-25 21:44:04 编辑 C++的初始化列表相对于构造函数内赋值有效率优势,但仅限于类对象,对于内置类型没什么区别(梳理原话称之为“行为良好”),具体的在“深入详解C++对象模型中”有深入解释。
我个人不喜欢初始化列表的语法,而且最不解的就是“仅限于类对象,对于内置类型没什么区别”这一点,我感觉对于类来说,最有初始化价值的就是内置类型,而类成员对象,在构造的时候本身就会自动调用他本身构造函数啊,感觉没有初始化的绝对必要啊,这一点是不是C++引入的又一个比较蛋疼的复杂性呢?
确实这种方式能够增加灵活度,比如你可以在初始化列表中调用非默认的构造函数并赋任意值,但是C#和java里印象中没这东西吧,而且C++还把这里弄得像个陷阱似的——类对象如果在构造函数中初始化,效率会降低。
MFC里会给CString的控件关联变量自动加上初始化列表,我就直接会删掉,因为CString根本不需要初始化……而且初始化列表和静态类型还不兼容,有时候多线程调用还麻烦(当然,我避免静态数据,一般用传入this到线程的方法)。
[解决办法]
问题呢?为什么我没看到
[解决办法]
这个取决于个人风格吧,对内置类型写在里面外面效率都一样,用初始化列表看起来整齐点
[解决办法]
帮顶。
[解决办法]
嗯 对类对象如果不用初始化列表的话,最少多了一次复制运算符的调用,这个开销在某些时候有些大。
[解决办法]
如果一个类没提供默认构造函数就得靠这个
如果类里面有const成员想要初始化也得靠这个
java里面有这两个需求吗
[解决办法]
有点乱~!
[解决办法]
我今天刚看了那一节,它的解释是在构造函数内部内置类型和在初始化列表中效率是一样的。对对象,如果写在构造函数类部,可能先调用这个成员对象的默认构造函数,然后再调用改成员对象的拷贝构造函数,如果只写在初始化列表中,直接调用具体的构造函数或拷贝构造,少了默认构造函数了。如果用指针,估计差别不大。
当然它这个讨论的是编译器可能的实现,不知道现在的编译器是如何做的。
[解决办法]
我个人不喜欢初始化列表的语法,而且最不解的就是“仅限于类对象,对于内置类型没什么区别”这一点,我感觉对于类来说,最有初始化价值的就是内置类型,而类成员对象,在构造的时候本身就会自动调用他本身构造函数啊,感觉没有初始化的绝对必要啊,这一点是不是C++引入的又一个比较蛋疼的复杂性呢?
首先初始化列表只能写在构造函数中,LZ红色部分让我觉得初始化列表不是构造函数的专利
其次对于指针类型的成员对象,不初始化就容易出现野指针。
[解决办法]
如果构造函数抛异常怎么办啊
初始化列表无论怎么说都会在函数体之前
工作。即使构造函数抛异常,也可以完成初始化的工作。
个人觉得初始化列表有用,一点建议。
[解决办法]