《Exceptional C++》笔记(2)
来源:互联网 发布:ubuntu改变系统语言 编辑:程序博客网 时间:2024/04/30 00:02
- 1 内存管理
- 2 对象标识
- 3 控制流程
1 内存管理
- operator new和operator delete永远都是静态成员函数!,因此最好显示第将这两个函数声明为静态函数,虽然C++并不会强制要求显式第使用static
- operator new和operator delete因为是一个静态函数,因此不能成为虚函数,但从行为上来看它们却像是虚函数,子类会调用正确的operator new和operator delete函数
- C++规定:传递给operator delete[]的指针的静态类型与动态类型必须是相同的.因此
- B* pb = new D[ 100 ];
- delete[] pb
- //这段代码的行为是未定义的
而对operator delete和operator new,operator new[ ]则并无此限制. 因此,永远都不要通过多态的方式处理数组
- const autoptr意味着永远不会失去所有权,因此对一个const autoptr进行拷贝是非法的(autoptr的拷贝函数参数为非const引用).
2 对象标识
- 在编写拷贝赋值运算函数时,永远都不要指望能够通过对自我赋值进行检测来保证函数的正确性(当类operator&可以被重载);应该在拷贝赋值运算符函数中使用"创建临时对象并进行交换"的惯用法,折中方法不仅是异常安全的,而且在处理自我赋值时也是安全的.
- 可以将自我赋值检测作为一种优化手段,以避免不必要的工作,这也是正确的做法
- 在构造函数中进行自我赋值的检测是无意义的,因为我们的对象还在构造过程中,因此对象other与我们的对象不可能相等
- 在有些情况下,指针的比较运算与大多数人想象的不一样
- 对字符串常量进行比较运算的行为未定义.因为C++标准明确指出,编译器可以在重叠的内存中存储字符串
- 有时候,在通过内部的运算符<,<=,>,>=来比较裸指针时,不能得到明确定义的结果.
3 控制流程
- 在编译单元之间,全局变量(包括类的静态成员)的初始化顺序是未定义的 避免使用全局变量或静态变量.如果必须使用,那么一定要特别注意这些变量的初始化顺序
- 在多重继承中,子类按照从左到右顺序对非虚基类进行初始化,为了防止一个基类初始化时用到了另一个基类,另一个基类还未初始化的情况出现: 在构造函数的初始值列表中,应该把基类按照它们在类定义中出现的先后顺序进行排序
- 成员变量是按照它们在类定义中出现的先后顺序来进行初始化的: 在构造函数的初始值列表中,应该把成员变量按照它们在类定义中出现的先后顺序进行排序
- 对函数参数进行求值的顺序是未定义的: 在编写代码时,永远都不应该依赖函数参数的求值顺序
- assert()函数会在release版本中被去掉: 永远不要使代码的执行依赖于函数assert()的调用
Date: 2013-04-16 07:08:00 中国标准时间
Author:
Org version 7.8.11 with Emacs version 24
本文出自 “暗日” 博客,请务必保留此出处http://darksun.blog.51cto.com/3874064/1178917
0 0
- 《Exceptional C++》笔记(2)
- 《Exceptional C++》笔记(1)
- Exceptional C
- Exceptional C++学习笔记(2) 多态
- 《More Exceptional C++》读书笔记
- 《More Exceptional C++》读书笔记
- Exceptional C++: [Afterword] [后记]
- More Exceptional C++ 笔记
- Exceptional C++ Syle 学习笔记
- Exceptional C++ 学习笔记1
- 《Exceptional c++》和《提高c++性能的编程技术》学习笔记
- Exceptional C++ Style之2
- More Exceptional C++ 读书笔记2
- Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions
- A software design priciple from 'Exceptional C++' of Herb sutter
- Exceptional C++: [Item 46 Forwarding Functions] [条款46 转发函数]
- Exceptional C++: [Item 47. Control Flow] [条款47 控制流]
- 《CS:APP》 chapter 8 Exceptional Control Flow 笔记
- <More Effective C++>笔记--技巧
- <More Effective C++>笔记--其他杂项
- 让vim正确显示cfg文件中的xxx = yyy=zzz
- Remember Mode 指导
- 《Exceptional C++》笔记(1)
- 《Exceptional C++》笔记(2)
- Emacs在走向没落吗?
- 《org-remember》翻译
- <org manual>翻译--摘要
- <org manual>翻译--安装
- <org manual>翻译--激活
- <org manual>翻译--1.4 反馈 : BUG报告,好的想法,补丁等等
- <org manual>翻译--1.5 手册中的排版约定
- <org manual>翻译--2.1 大纲