百科问答小站 logo
百科问答小站 font logo



C++构造函数为什么要依赖初始化列表? 第1页

  

user avatar   haozhi-yang-41 网友的相关建议: 
      

我来提点似乎比较少人提的点:

初始化成员变量这么简单的事哪里让编译器无法判断了,哪个变量在哪里第一次被赋值编译器心里没点数吗?

实际上,对于复杂项目,编译器在编译期确实是不知道的“哪个变量在哪里第一次被赋值”的。

例如说类A的构造函数实现在a.cpp里,所以类A的初始化列表和它的构造函数具体实现都只在编译a.cpp时可见。但是它在b.cpp里new,所以你赋值的大括号在编译b.cpp时才可见。所以,初始化列表、构造函数、赋值大括号并不总是同时可见的,自然就不可能在编译期知道:“哪个变量在哪里第一次被赋值”。而且这种场景在实际工作中才是主流模式,都写到一个文件里的,那多半是个demo,而且还是个很简陋的demo。

当然,真要想知道也不是太难,编译器偷偷增加个bit去记录成员变量是否被初始化的运行时信息,然后再根据这些信息选择操作,也行。但这就违反了C/C++的一贯原则:“非必要无开销”。


不过:

初始化列表这个东西真是集简陋与难看于一身

这个吐槽我倒是在一定程度上同意——当然很可能不是题主所设想的方向。

主要想吐槽的是初始化列表的执行顺序是声明顺序而不是初始化列表顺序。

这么设计的好处实话说我没想到,但一个很明显的坏处就是:当某个类的成员之间的依赖关系变了,需要调整初始化顺序时,就必须修改类的声明。而往往类的声明是在头文件里的,如果这个头文件被广泛的包含的话,那就会触发一大片的重编——在大型项目里,这可能就是一两个小时了。


user avatar   pansz 网友的相关建议: 
      

低情商:是的,已经结束了。

高情商:diy的时代暂停了,只不过我们暂时不知道重新开放的期限。


user avatar   ling-jian-94 网友的相关建议: 
      

这是我看到的最准确的总结。

总的来说,就是中国的高考相对公平,所以性价比极高,所以其他活动都可以适当让步。




  

相关话题

  C++中,auto关键字有哪些乱用的情况?平时使用有哪些坑? 
  C# 和 Java 哪个更像 C++? 
  如果一定要在C++和JAVA中选择,是C++还是java? 
  学习 C/C++ ,有什么书籍推荐? 
  是 C++ 的发展进入了邪路,还是我写代码的姿势不正确? 
  C++中如何将string类型转换为int类型? 
  为什么当年 Android 选择用 Java 作为开发语言? 
  C++函数收到一个指针T* ptr,没有其他信息,如何判断应该用delete还是delete[]? 
  GCC 4 编译警告:warning: dereferencing type-punned pointer will break strict-aliasing rules 有什么比较好的解决办法? 
  为什么微软不把C# 设计成像C++一样可以编写底层3D程序的一门语言了? 

前一个讨论
动物界有爷爷奶奶帮助养育后代的吗?
下一个讨论
如何看待男子路遇车祸救人发现死者是女儿?肇事司机刚刚才通过科四考试,考驾照需要更严格吗?





© 2025-04-04 - tinynew.org. All Rights Reserved.
© 2025-04-04 - tinynew.org. 保留所有权利