博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
条款04:确定对象在使用前已经被初始化
阅读量:5145 次
发布时间:2019-06-13

本文共 1022 字,大约阅读时间需要 3 分钟。

读取未初始化的值会造成不明确的行为。

  • 对于内置类型来说,我们必须手工完成初始化。
  • 对于类类型来说,这个责任由构造函数来承担,所以构造函数要确保所有的数据成员有被初始化。

例如下面这个构造函数:

ABEntity::ABEntity(const std::string& name, const std::string& address,

                                     const std::list<PhoneNumber>& phones)

                   {

                            theName = name;

                            theAddress = address;

                            thePhones = phones;                         

                   }

注意这是我们新手比较容易犯的一个错误,我们以为上面这个构造函数对成员进行了初始化。其实,这不是初始化,这是赋值。虽然ABEntity可以得到你期望的值。

         C++规定初始化的动作发生在进行构造函数本体之前。

 

比较好的一个做法是使用成员初始化列表:

ABEntity::ABEntity(const std::string& name, const std::string& address,

                                                                                     const std::list<PhoneNumber>& phones)

                                                                                     : theName(name),

theAddress(address),

                                                                                      thePhones(phones){}

基于赋值的那个版本,首先调用default构造函数为theName,theAddress,thePhones设初始值,然后,在函数体内再进行赋值。所以说default构造函数所做的一切都没有用。

 

而基于成员初始值列表的做法是直接调用theName,theAddress,thePhones的copy构造函数。

对于大多数而言,第二种方式每个成员只调用一次copy构造函数的方式高效的多。而对于内置类型来说,采用成员初始化列表与在构造函数内进行赋值的代价是一样的,但为了统一,也把内置类型的初始化放在成员初始化列表。

 

问为什么内置类型的初始化,两种方式一样?

初始化是两个过程:内存分配,填写值。

对于第一种方式,在函数体内进行赋值,是先内存分配,再赋值。对于在成员初始化列表中初始化也是先分配内存,再赋值。两种作法的步骤都一样。

而类成员,第一种方式会导致调用默认构造函数无用功。

 

 

 

转载于:https://www.cnblogs.com/loveyakamoz/archive/2012/11/15/2772371.html

你可能感兴趣的文章
rpm 校验
查看>>
搭建eureka服务
查看>>
二叉树
查看>>
c++浅复制和深复制
查看>>
在一个view类里面获取viewcontroller
查看>>
我的框架说明文档 2016-04-06
查看>>
【C/C++开发】C++ Thread对象封装
查看>>
【VS开发】VSTO 学习笔记(十)Office 2010 Ribbon开发
查看>>
【并行计算-CUDA开发】从熟悉到精通 英伟达显卡选购指南
查看>>
【计算机视觉】背景建模之PBAS
查看>>
http header Content-Type之常用三种
查看>>
[转]ab参数详解 – 压力测试
查看>>
线程ThreadDemo04
查看>>
windows平台下node,npm,gulp配置
查看>>
《C#并行编程高级教程》第5章 协调数据结构 笔记
查看>>
android开发 NDK 编译和使用静态库、动态库 (转)
查看>>
数学之美
查看>>
Android sd卡状态监听,文件搜索,媒体文件刷新
查看>>
[翻译]ASP.NET MVC4新特性之脚本压缩和合并
查看>>
UWP: 掌握编译型绑定 x:Bind
查看>>