effective c++ (二)
条款04:确定对象使用前已先被初始化
1、由于 c part of c++而且初始化可能导致运行期成本,那么就不保证发生初始化;例如arry是c part of c++的部分从而不能保证初始化,而STL的vector则可以保证初始化
2、由于规则复杂多变,故最佳处理办法就是:永远在使用对象之前将它初始化
3、由于C++规定对象成员的初始化动作发生在进入构造函数本体之前,故在构造函数中给定成员初值不是成员变量初始化,而是赋值动作。(C++类成员变量初始化发生于这些成员变量的default构造函数被自动调用之时,但是此规则不适用与C内置类型,因为内置类型没有default构造函数)
class PhoneNumber { ... };
class ABEntry
{
public:
ABEntry(const std::string &name, const std::string &address, const std::list<PhoneNumber> &phones) ;
private:
std::string theName;
std::string theAddress;
std::list<PhoneNumber> thePhones;
int numTimesConsulted;
};
ABEntry::ABEntry(const std::string &name, const std::string &address, const std::List<PhoneNumber> &phones)
{
theName = name; //注意:此处已经是赋值,而非初始化
theAddress = address;
thephones phones;
numTimesConsulted =;
}
ABEntry::ABEntry(const std::string &name, const std::string &address, const std::List<PhoneNumber> &phones)
:theName(name), theAddress(address), thePhones(phones), numTimesConsulted()
{}
4、使用初始化列表相当于只用了一次copy函数,而使用构造函数给定初值相当于先调用成员变量的构造函数然后调用copy assignment
5、const与reference类型的成员变量必须使用初始化列表初始化(建议:为了避免区分,可以总是采用成员初始化列表书写构造函数,即使无参构造函数也可以)
6、C++有着十分固定的成员初始化顺序:base class更早于derived classes被初始化, 而class的成员变量总以其声明次序初始化
7、non-local static 在不同的编译单元的初始化次序存在不确定性,尽量使用local static 代替non-local static
class FileSystem{ ... ... }
FileSystem &tfs()
{
static FileSystem fs;
return fs;
}
class Directory { ... ... }
Directory::Directory(params)
{
std::size_t disks = tfs().numDisks();
}
请记住:
1、为内置型对象进行手工初始化,因为c++不保证初始化它们
2、构造函数最好使用初始化列表,不要在构造函数本体内进行赋值,且初始化列表顺序应该与声明顺序保持一致
3、为免除“垮编译单元的初始化次序”问题,用local-static代替non-local static
条款05:了解C++默认编写并调用哪些函数
1、如果你自己没有声明,编译器将自动为类声明一个copy构造函数、一个copy assignment操作符和一个析构函数、以及default构造函数。(注意:自动声明的函数都是public且inline)
2、注意copy assignment操作符不是总是生成的,在以下三种情况编译器会拒绝自动生成copy assignment操作符:
a、类中含有reference成员(因为c++不允许改变引用变量)
b、内涵const 成员变量
c、base class将copy assignment操作符声明为private
条款06:若是不想使用编译器自动生成的函数,就该明确拒绝
1、将copy函数或这copy assignment声明为private(注意:其member函数和friend函数还是能够调用)
2、继承Uncopyable这样的base class
class Uncopyable
{
pretected:
Uncopyable() {}
~Uncopyable {}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
}
effective c++ (二)的更多相关文章
- Effective Java-第二章
第1章 如何最有效地使用Java程序设计语言机器基本类库:java.lang,java.util,java.util.concurrent和java.io. Sun JDK1.6_05版本 第2章 创 ...
- DB2数据库常用基本操作命令
点击开始菜单-->所有程序-->IBM-->DB2-->DB2COPY1-->命令行工具-->命令窗口一.DB2实例操作1.查看DB2数据库的版本及安装目录 E:\ ...
- nohup、&、 2>&1详解
前言 对一个程序员来说,java项目的打包部署也是一项必须掌握的一项技术任务,现我将自己平时在maven下打包以及部署项目总结,希望对有这方面诉求的小伙伴有所帮助! 一.maven项目打包及命令 (1 ...
- [.NET] 《Effective C#》读书笔记(二)- .NET 资源托管
<Effective C#>读书笔记(二)- .NET 资源托管 简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内 ...
- [.NET] 《Effective C#》快速笔记(二)- .NET 资源托管
<Effective C#>快速笔记(二)- .NET 资源托管 简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内 ...
- 《Effective C#》快速笔记(二)- .NET 资源托管
简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内存,我们并不需要去担心内存泄漏,资源分配和指针初始化等问题.不过,它也并非万能 ...
- Effective java笔记(二),所有对象的通用方法
Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...
- Effective Java 读书笔记之二 对于所有对象都通用的方法
尽管Object是一个具体的类,但设计它主要是为了扩展.它的所有非final方法都有明确的通用约定.任何一个类在override时,必须遵守这些通用约定. 一.覆盖equals时请遵守通用的约定 1. ...
- effective OC2.0 52阅读笔记(二 对象、消息、运行期)
第二章:对象.消息.运行期 6 理解属性这一概念 总结:OC解决硬编码偏移量问题的做法,一种方案是把实例变量当做一种存储偏移量所用的特殊变量,交由类对象保管,偏移量会在运行期查找,叫做稳固的“应用程序 ...
- Effective C# 学习笔记(原则二:为你的常量选择readonly而不是const)
原则二.为你的常量选择readonly而不是const Prefer readonly to const 对于常量,C#里面有两个不同的版本:运行时常量(readonly)和编译时常量(co ...
随机推荐
- mysql二
日期 MONTHNAME(birth) 月份的英文 模式匹配 变量 统计
- hibernate不关闭session后果
(转自:百度知道) 看是怎么获得session的. 方法1: 通过配置监听器后,在Dao中用getCurrentSession获取(内部原理....),此时无需管理session的关闭与否: 方法2: ...
- (六)6.9 Neurons Networks softmax regression
SoftMax回归模型,是logistic回归在多分类问题的推广,即现在logistic回归数据中的标签y不止有0-1两个值,而是可以取k个值,softmax回归对诸如MNIST手写识别库等分类很有用 ...
- 文件IO
在unix世界中视一切为文件,无论最基本的文本文件还是网络设备或是u盘,在内核看来它们的本质都是一样的.大多数文件IO操作只需要用到5个函数:open . read . write . lseek 以 ...
- [Everyday Mathematics]20150218
设 $A,B$ 是 $n$ 阶复方阵, 适合 $$\bex A^2B+BA^2=2ABA. \eex$$ 试证: 存在 $k\in\bbZ^+$, 使得 $(AB-BA)^k=0$.
- pdm 中怎么修改表的Name值时使Code值不变
修改方法:PowerDesign中的选项菜单里修改,在[Tool]-->[General Options]->[Dialog]->[Operating modes]->[Nam ...
- iframe根据子页面自动调整大小
//iframe高度自适应 function IFrameReSize(iframename) { var pTar = document.getElementById(iframename); if ...
- list 容器 排序函数.xml
pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9; ...
- cmd命令 chcp
chcp是“change code page”的缩写.(关于代码页的相关知识详见:http://www.cnblogs.com/minisculestep/articles/4920992.html)
- html --- VML --- javascript --- 旋转矩形
矢量标记语言 --- Vector Markup Language 运行它的代码需要打开IE的兼容性视图 如有疑问请参考:http://msdn.microsoft.com/en-us/library ...