条款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++ (二)的更多相关文章

  1. Effective Java-第二章

    第1章 如何最有效地使用Java程序设计语言机器基本类库:java.lang,java.util,java.util.concurrent和java.io. Sun JDK1.6_05版本 第2章 创 ...

  2. DB2数据库常用基本操作命令

    点击开始菜单-->所有程序-->IBM-->DB2-->DB2COPY1-->命令行工具-->命令窗口一.DB2实例操作1.查看DB2数据库的版本及安装目录 E:\ ...

  3. nohup、&、 2>&1详解

    前言 对一个程序员来说,java项目的打包部署也是一项必须掌握的一项技术任务,现我将自己平时在maven下打包以及部署项目总结,希望对有这方面诉求的小伙伴有所帮助! 一.maven项目打包及命令 (1 ...

  4. [.NET] 《Effective C#》读书笔记(二)- .NET 资源托管

    <Effective C#>读书笔记(二)- .NET 资源托管 简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内 ...

  5. [.NET] 《Effective C#》快速笔记(二)- .NET 资源托管

    <Effective C#>快速笔记(二)- .NET 资源托管 简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内 ...

  6. 《Effective C#》快速笔记(二)- .NET 资源托管

    简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内存,我们并不需要去担心内存泄漏,资源分配和指针初始化等问题.不过,它也并非万能 ...

  7. Effective java笔记(二),所有对象的通用方法

    Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...

  8. Effective Java 读书笔记之二 对于所有对象都通用的方法

    尽管Object是一个具体的类,但设计它主要是为了扩展.它的所有非final方法都有明确的通用约定.任何一个类在override时,必须遵守这些通用约定. 一.覆盖equals时请遵守通用的约定 1. ...

  9. effective OC2.0 52阅读笔记(二 对象、消息、运行期)

    第二章:对象.消息.运行期 6 理解属性这一概念 总结:OC解决硬编码偏移量问题的做法,一种方案是把实例变量当做一种存储偏移量所用的特殊变量,交由类对象保管,偏移量会在运行期查找,叫做稳固的“应用程序 ...

  10. Effective C# 学习笔记(原则二:为你的常量选择readonly而不是const)

    原则二.为你的常量选择readonly而不是const      Prefer readonly to const 对于常量,C#里面有两个不同的版本:运行时常量(readonly)和编译时常量(co ...

随机推荐

  1. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  2. Typed Message模式与Event Sourcing

    引言 在<设计模式沉思录>(Pattern Hatching: Design Patterns Applied,[美]JohnVlissides著)一书的第4章中,围绕事件Message传 ...

  3. context-param引发spring容器以及servlet容器的关联

    转自:http://blog.csdn.net/liaoxiaohua1981/article/details/6759206 格式定义: [html] view plaincopy <cont ...

  4. 【英语】Bingo口语笔记(38) - See系列

    see somebody off 送别 see somebody out 看到谁从哪里出来

  5. 一道program test题目

    前天去面试的一道上机测试题(凭记忆写的题目)Question:给定输入整数\(\left( k \right)\),找到最小的自然数\(n\left( {n \ge 1} \right)\),使得下列 ...

  6. jQuery基础知识--Form基础(续)

    下拉框应用 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...

  7. 身份证上的X到底代表什么?

    生活中,无论你是坐火车,还是办理各种手续,都需要用到身份证,它现在已经俨然成为我们生活的非常重要的一部分,但是关于身份证本身,你了解多少呢? 有人会说了,为什么我的身份证上写的有效时间是10年,而一些 ...

  8. Multi-Device Hybrid Apps for Visual Studio CTP2.0

    http://msdn.microsoft.com/en-us/library/dn771545.aspx http://www.microsoft.com/en-us/download/detail ...

  9. 网络编程 --- URLConnection --- 读取服务器的数据 --- java

    使用URLConnection类获取服务器的数据 抽象类URLConnection表示一个指向指定URL资源的活动连接,它是java协议处理器机制的一部分. URL对象的openConnection( ...

  10. PASCAL相关图书推荐

    PASCAL程序设计(第2版) 作      者 郑启华 著 出 版 社 清华大学出版社 出版时间 2013-01-01 版      次 2 页      数 286 印刷时间 2013-01-01 ...