为什么C++默认初始化时,内置类型和类类型区别对待?

C++局部变量,在默认初始化内置类型时,值是未定义的。但是对于类类型,却会自动调用默认构造函数来进行默认初始化。

对于这点,其实来自于C/C++的一贯坚持的哲学:不做产生额外开销的事。具体到这个问题,是这样的:对于POD类型(就是你所说的“内置类型”,全称是:Plain Old Data),因为它的数据结构和操作模型都已经在C的标准文本中仔细定义了,而C++为了最大程度的兼容C代码,这部分自然也要照抄。所以,C++完全没有必要额外的增加“初始化为0”的开销。一方面是为了兼容C,另一方面是没有付出这些额外开销的必要性。对于非POD类型,初始化的额外开销是不可避免的:因为(为了性能),它的内存布局并没有在标准中定义,甚至连vtable之类,也是实现相关的内容。所以,对于非POD类型如何布局、如何初始化、何种状态表明其“可用”……标准是把它交给编译器和代码编写者的。而既然把决策权和实现权交了出去,那为了代码跨平台/跨编译器的移植性和兼容性考虑,自然就需要约定操作模型——这就是为什么非POD类型要有一系列的特殊成员函数:包括构造函数、析构函数,另外还有拷贝构造和=操作符。另外,在C++中,对于POD或者非POD类型,其实并没有区别对待:当不提供明确初始化代码时,都没有默认的“初始化为0”的操作(static除外)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值