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 ...
随机推荐
- LeetCode Reverse Nodes in k-Group 每k个节点为一组,反置链表
题意:给一个单链表,每k个节点就将这k个节点反置,若节点数不是k的倍数,则后面不够k个的这一小段链表不必反置. 思路:递归法.每次递归就将k个节点反置,将k个之后的链表头递归下去解决.利用原来的函数接 ...
- ecshop 设置管理员
<?php define('IN_ECS', true); require(dirname(__FILE__) . '/includes/init.php'); $admin_name=trim ...
- HDU3232 Crossing rivers
思路:这题关键一点就是根据题目的描述和测试数据得到启发,船都是 从对岸划过来的.心中有具体场景,就可以很简单了. #include<cstdio> int main() { ; ; whi ...
- 【转】【iOS系列】-iOS查看沙盒文件图文教程(真机+模拟器)
原文网址:http://www.cnblogs.com/fengtengfei/p/5090276.html 1:模拟器 1.1 方法1: 程序中打印一下的地址,能直接前往沙盒路径. NSString ...
- IconRes提供免费高质量的Material风格android官方图标库
连接地址: http://www.iconres.com/android/index.php
- sort方法的使用、随机数的产生
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序. var arr = ['a','b','m','c','d']; arr.sort(); ...
- rsync同步时报“auth failed on module”错误的可能原因
关于这个auth失败的问题,有以下可能的情况: 1.密码输入错误: 请再次确认你登录用户的密码无误 2.secrets file格式错误: secrets file的文件格式是 upload ...
- Informatica9.6.1在Linux Red Hat 5.8上安装遇到的有关问题整理_3
3.Repository Service启动后的页面编码问题 1)错误信息: 2)原因分析及解决步骤 原因分析: informatica产品安装背后AdminConsole的Code page默认为U ...
- ACE的 日志
http://wenku.baidu.com/link?url=dK6j9_0pICRjxWW7usBlkCxPTa8zFSPyUe_uWAkwMPFDU4ip_tEfxpOitxjkl3RuPy3D ...
- 页面性能测试&提升方式
性能测试包括:web系统页面测试.web系统后台测试 2种方式来提升你的web 应用程序的速度: ● 减少请求和响应的往返次数 ● 减少请求和响应的往返字节大小. 详细的看此文http://www.5 ...