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 ...
随机推荐
- HDU 5273 Dylans loves numbers(水题)
题意:给出一个0≤N≤1018,求其二进制中有几处是具有1的,假设相连的1只算1处,比如1101011就是3处. 思路:一个个数,当遇到第一个1时就将flag置为1:当遇到0就将flag置为0.当遇到 ...
- android layoutparams应用指南(转)
LayoutParams相当于一个Layout的信息包,它封装了Layout的位置.高.宽等信息.假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉L ...
- HDU1495 非常可乐
解题思路:简单的宽搜,见代码: #include<cstdio> #include<cstring> #include<algorithm> #include< ...
- Spring IOC 三种注入方式
1. 接口注入 2. setter注入 3. 构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类 ...
- 《C++ Primer 4th》读书笔记 序
注:本系列读书笔记是博主写作于两三年前的,所以是基于<C++ Primer>第四版的,目前该书已更新至第五版,第五版是基于C++11标准的,貌似更新挺多的.博主今年应届硕士毕业,如若过阵子 ...
- linux shell中的 #!/bin/bash
#!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...
- 在Linux上安装多Jboss个需要修改的端口
如果在一台机器上部署了多个jboss server,需要修改相关端口以避免端口冲突.目前确认需要修改的配置如下一.vi $JBOSS_HOME/server/default/conf/jboss-se ...
- 页面性能测试&提升方式
性能测试包括:web系统页面测试.web系统后台测试 2种方式来提升你的web 应用程序的速度: ● 减少请求和响应的往返次数 ● 减少请求和响应的往返字节大小. 详细的看此文http://www.5 ...
- OpenGl从零开始之坐标变换(上)
坐标变换是深入理解三维世界的基础,非常重要.学习这部分首先要清楚几个概念:视点变换.模型变换.投影变换.视口变换. 在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,因 ...
- 《学习OpenCV》中求给定点位置公式
假设有10个三维的点,使用数组存放它们有四种常见的形式: ①一个二维数组,数组的类型是CV32FC1,有n行,3列(n×3) ②类似①,也可以用一个3行n列(3×n)的二维数组 ③④用一个n行1列(n ...