对于内置类型以外的初始化责任落在构造函数身上。如下:

class PhoneNumber{};
class ABEntry{
public:
ABEntry( const string& name, const string& address, const list<PhoneNumber>& phones );
private:
string theName;
string theAddress;
list<PhoneNumber> thePhones;
int numTimesConsulted;
}; ABEntry::ABEntry( const string& name, const string& address, const list<PhoneNumber>& phones )
{
theName = name;
theAddress = address;
thePhones = phones;
numTimesConsulted = ;
}

以上对数据成员不是初始化,而是赋值。初始化发生在更早的时候,发生于这些成员的default构造函数被自动调用之时。

ABEntry::ABEntry( const string& name, const string& address, const list<PhoneNumber>& phones )
: theName(name),
theAddress(address),
thePhones(phones),
numTimesConsulted()
{}

以上这个通常效率要高,这次只调用了一次默认构造函数而没有使用赋值。

规则:总是在初值列中列出所有的成员变量,以免还要记住那些成员变量可以无需初值。

如果成员变量是const或者references,他们就一定需要初值而不能被赋值。最简单做法:总是使用成员初值列。

成员初始化次序:base classes更早于derived classes被初始化。class成员总是以其声明的次序被初始化(即privated中的次序)。

class FileSystem{
public:
size_t numDisks() const;
};
extern FileSystem tfs; class Directory{
Directory( params);
};
Directory::Directory(params)
{
size_t disks = tfs.numDisks();
}
Directory tempDir(params);

以上FileSystem和Directory属于不同的文件系统,tempDir在使用之前需要将tfs初始化。但是系统并不能保证其初始化,如何将tfs这个non-local static对象在被disks使用前进行初始化。方法:将每个non-local static对象搬到自己的专属的函数里面,返回一个reference指向所包含的对象。使得non-local static对象被local static对象所替代。解决方案如下:

总结

1. 为内置类型对象进行手工初始化,因为c++不一定保证初始化他们;

2. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,排列次序应该和声明次序相同;

3. 为免除“跨编译单元制初始化次序”问题,以local static对象替换non-local static对象。

effective c++(04)之对象使用前初始化的更多相关文章

  1. effective c++:尽量替换define,确保对象使用前初始化

    #define ASPECT_RATIO 1.653 名为ASPECT_RATIO的值在预编译阶段被替换成1.653,如果在这个常量上出现编译错误,我们可能会困惑1.653的值是什么意思,于是将因为跟 ...

  2. 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化

    永远在使用对象之前先将它初始化.对于无任何成员的内置类型,你必须手工完成此事. 至于内置类型以外的任何其他东西,初始化责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化. ...

  3. Effective C++ -----条款04:确定对象被使用前已被初始化

    为内置型对象进行手工初始化,因为C++不保证初始化它们. 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作.初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同. 为免 ...

  4. 《Effective C++》——条款04:确定对象使用前已先被初始化

    读取未初始化的值会导致不明确的行为.在某些平台上,仅仅只是读取未初始化的值,就可能让你的程序终止运行.更可能的情况是读入一些“半随机”bits,污染了正在进行读取动作的那个对象,最终导致不可预知的程序 ...

  5. 读书笔记 effective c++ Item4 确保对象被使用前进行初始化

    Item4 确保对象被使用前进行初始化 C++在对象的初始化上是变化无常的,例如看下面的例子: Int x; 在一些上下文中,x保证会被初始化成0,在其他一些情况下却不能够保证.看下面的例子: Cla ...

  6. [effictive c++] 条款04 确定对象被使用前已被初始化

    成员初始化 在c和c++ 中,使用为初始化的类型经常会引发不可预料的错误,从而使得我们要花费巨大的时间用于调试查找问题,所以确定对象被使用前已被初始化是个非常好的习惯. 永远在使用之前对对象进行初始化 ...

  7. Effective C++(4) 确定对象被使用前已先被初始化

    危害:读取未初始化的值会导致不明确甚至是半随机化的行为. 最佳处理办法:永远在使用对象之前先将它初始化:确保每一个构造函数都将对象的每一个成员初始化. 1 注意区分赋值和初始化: 从初始化的角度而言, ...

  8. stack与heap、new的内存分配、static对象。(effective c++ 04)

    阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象."不同编译单元内定义的non-local static对象". 了解一下.    目录 sta ...

  9. C++内存管理(effective c++ 04)

    阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象.看了看侯老师的内存管理视频1~3.有点深. 了解一下. 目录 1 内存管理 1.1 C++内存管理详解 1.1.1 ...

随机推荐

  1. spring--处理器拦截器详解——跟着开涛学SpringMVC

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...

  2. WinForm触摸屏程序功能界面长时间不操作自动关闭回到主界面 z

    操作者经常会在执行了某操作后,没有返还主界面就结束了操作然后离开了,程序应该关闭功能窗体自动回到主界面方便下一位操作者操作.那么对于WinForm程序怎么实现呢? 实现原理:拦截Application ...

  3. [Stephen]关于Ext.net fileupload 的兼容性解决问题

    在firefox下,利用fileupload上传图片后,通过后端将image 的src路径进行更新,刷新前段界面显示没有问题. 但是在以IE为内核的360中,这种上传后的更新导致一个命名为Action ...

  4. HashPasswordForStoringInConfigFile 已过时

    在.net 4.5版本下,使用System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile进行MD5加密时,会出 ...

  5. 【原】Redis基本操作

    Redis基本操作 遍历操作 Pub-Sub server Lua脚本 Redis中的这些操作都是不分大小写的. 除了针对于具体类型的具体操作.还有一些其他操作. 遍历操作 SCAN cursor [ ...

  6. 【原】SparkContex源码解读(二)

    版权声明:本文为原创文章,未经允许不得转载. 继续前一篇的内容.前一篇内容为: SparkContex源码解读(一)http://www.cnblogs.com/yourarebest/p/53266 ...

  7. FlexSlider插件的详细设置参数 http://www.woothemes.com/flexslider/

    http://www.woothemes.com/flexslider/ FlexSlider插件的详细设置参数 $(window).load(function() { $('.flexslider' ...

  8. vs2010常用快捷方式

    1.注释 直接打三个"///"就会出现 /// <summary> ///非方法体上 /// </summary> MusicStoreEntities s ...

  9. POJ 2251 Dungeon Master (BFS最短路)

    三维空间里BFS最短路 #include <iostream> #include <cstdio> #include <cstring> #include < ...

  10. codeforce 621B Wet Shark and Bishops

    对角线 x1+y1=x2+y2 或者x1-y1=x2-y2 #include<iostream> #include<string> #include<algorithm& ...