《Effective C++》学习笔记条款04 确定对象被使用前被初始化
来源:互联网 发布:js下载文件进度条 编辑:程序博客网 时间:2024/05/15 05:36
条款04:确定对象被使用前已先被初始化
永远在使用对象之前先将它初始化。对于无任何成员的内置类型,你必须手工完成此事。至于内置类型以外的任
何其它东西,初始化责任落在构造函数身上,确保每一个构造函数都将对象的每一个成员初始化。
1、 赋值和初始化:
C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。所以应将成员变量的初始化置于构造函数
的初始化列表中。
ABEntry::ABEntry(conststd::string& name, const std::string& address,
const std::list<PhoneNumber>& phones)
{
theName = name; //这些都是赋值,而非初始化
theAddress = address; //这些成员变量在进入函数体之前已调用默认构造函数,接着又调用赋值函数,
thePhones = phones; //即要经过两次的函数调用。
numTimesConsulted = 0;
}
ABEntry::ABEntry(conststd::string& name, const std::string& address, const std::list<PhoneNumber>& phones)
: theName(name), //这些才是初始化
theAddress(address), //这些成员变量只用相应的值进行拷贝构造函数,所以通常效率更高。
thePhones(phones),
numTimesConsulted(0)
{ }
所以,对于非内置类型变量的初始化应在初始化列表中完成,以提高效率。
而对于内置类型对象,如numTimesConsulted(int),其初始化和赋值的成本相同,但为了一致性最好也通过成员
初始化表来初始化。如果成员变量时const或reference,它们就一定需要初值,不能被赋值。
C++有着十分固定的“成员初始化次序”。基类总是在派生类之前被初始化,而类的成员变量总是以其说明次序被初
始化。所以:当在成员初始化列表中列各成员时,最好总是以其声明次序为次序。
2、 请记住:
- 为内置对象进行手工初始化,因为C++不保证初始化它们;
- 构造函数最好使用成员初始化列表,而不要在构造函数本体内使用赋值操作。初始化列表列出的成员变量,其排列次序应该和它们在类中的声明次序相同;
- 为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。
- 《Effective C++》学习笔记条款04 确定对象被使用前被初始化
- Effective C++学习4 条款04:确定对象在被使用前以被初始化
- Effective C++:条款04:确定对象被使用前已先被初始化
- [Effective C++]条款04 确定对象被使用前已先被初始化
- Effective c++ 学习笔记——条款04:确定对象被使用前已先被初始化
- Effective c++ 学习笔记——条款04:确定对象被使用前已先被初始化
- 《Effect C++》学习------条款04:确定对象被使用前以先被初始化
- 读书笔记《Effective C++》条款04:确定对象被使用前已先被初始化
- effective C++读书笔记 条款四 确定对象被使用前已经被初始化
- effective c++条款4-确定对象在使用前被初始化
- [effictive c++] 条款04 确定对象被使用前已被初始化
- 条款4:确定对象被使用前已经被初始化
- effective c++ 确定对象被使用前已经被初始化
- Effective C++条款04解读:确定对象被使用之前已先被初始化
- 《Effective C++读书笔记》--条款04:确定对象被使用前已先被初始化
- effective C++笔记之条款47: 确保非局部静态对象在使用前被初始化
- 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化
- 条款04:确定对象被使用前已经先被初始化
- 关于scanf和gets函数共用时出现的一些问题的解释
- Java过滤html标签
- 一天精通Linux基本操作篇
- Log4J 配置之以日期为文件名的日志
- Jsp验证码的制作
- 《Effective C++》学习笔记条款04 确定对象被使用前被初始化
- 利用百度地图api开发的应用实例
- 浙工ACM1450
- Everything研究之读取NTFS下的USN日志文件(2)
- 字符串函数
- Python的Lambda表达式
- hdu1576 A/B(扩展的欧几里德算法)
- Brief Intro to Blocks 5:Using Blocks
- NetworkError: 400 Bad Request