effective C++ 读书笔记

来源:互联网 发布:sql where语句 1,4 编辑:程序博客网 时间:2024/05/01 15:04
1.explicit 构造函数代表不能用于隐式转换
2.类成员变量尽量通过public函数访问
3.const char ×p (同char const ×p)与 char × const p(前面一个便是p指向的数据不能改变, 后面一个表示p本身不能改变)
4.让类的操作同固定类型一样
5.C++ 引用一般使用指针实现
6.避免对指针和int 类型进行重载(f(int),f(void *×))
7.不要返回类成员的非 const 指针或引用
8.不要返回局部变量的引用或指针
9.推迟变量定义,并且不在默认构造中用赋值的方式初始化对象,使用初始化列表
10.尽量不用内联函数,内联函数可以作为优化工具
11.公有继承只能表示是一个关系,任何适用于基类的规则也适用于继承类才能使用
12.基类必须把析构函数申明为virtrual 防止内存泄漏
13.继承接口:纯虚函数;继承接口和默认实现:虚函数;继承实现:非虚函数
14.禁止重新定义继承而来的非虚函数
15.虚函数的默认参数在继承后不要修改默认参数(虚函数动态绑定,默认参数静态绑定)
16.继承和模板,如果类型不影响行为,你可以使用模板。如果类型影响行为,你就需要虚函数,从而要使用继 
承。
17.面向对象用什么实现语义的两种方式:私有继承和包含。优先使用包含,如果需要访问虚函数和保护成员的时候使用私有继承
18.非虚函数代表了继承的不变性
19.内存对齐
struct A
{
char   c; //1byte
double d; //8byte
short s; //2byte
int i; //4byte
};
strua.c分配在一个起始于8的整数倍的地址1245032(为什么是这样读者先自己思考,读完就会明白),接下来要在strua.c之后分配strua.d,由于double为8字节,取N=min(8,8),8字节来对齐,所以从strua.c向后找第一个能被8整除的地址,所以取1245032+8得1245040, strua.s 为2byte小于参数n,所以N=min(2,8),即N=2,取2字节长度对齐,所以要从strua.d后面寻找第一个能被2整除的地址来存储strua.s,由于strua.d后面的地址为1245048可以被2整除,所以strua.s紧接着分配,现在来分配strua.i,int为4byte,小于指定对齐参数8byte,所以N=min(4,8)

20.缺省拷贝构造函数对类的非静态数据成员进行 "以成员为单位的" 逐一拷贝构造(赋 值)。即,如果m 是类C 中类型为T 的非静态数据成员,并且C 没有声明拷贝 构造函数(赋值运算符),m 将会通过类型T 的拷贝构造函数(赋值运算符) 被拷贝构造(赋值)---- 如果T 有拷贝构造函数(赋值运算符)的话。如果没 有,规则递归应用到m 的数据成员,直至找到一个拷贝构造函数(赋值运算符) 或固定类型(例如,int,double,指针,等)为止。默认情况下,固定类型的 对象拷贝构造(赋值)时是从源对象到目标对象的 "逐位" 拷贝。对于从别的 类继承而来的类来说,这条规则适用于继承层次结构中的每一层,所以,用户 自定义的构造函数和赋值运算符无论在哪一层被声明,都会被调用。
21.非局部静态变成初始化顺序没有规定,如果需要可以用函数返回局部static变量代替,函数static局部变量在第一次调用函数时进行初始化
22.C++头文件现状
  1. 新的C++头文件 如<iostream>功能与老的一样,但头文件内容在名字空间std下面
     2.  老的C++头文件<iostream.h>被继续支持
     3.  C库功能的新C++头文件<cstdio>功能与老的一样,但头文件内容在名字空间std下面
     4.  标准C库头文件<stdio.h>被继续支持
23.派生类成员按名字隐藏掉基类成员
0 0
原创粉丝点击