【Effective C++ Sumary】设计与声明
18.让接口容易被正确使用。for example
class Date
{
public:
Date(int year,int month,int day);
private:
int year;
int month;
int day;
};
//调用
Date(2,30,2019);
//客户容易把顺序记错不是吗
//我们可以用函数返回来取代数值参数,这样更不容易犯错
struct year{};
struct month{};
struct day{};
Date(year(),month(),day());
最好保证接口一致性,多使用tr1::shared_ptr,可以消除资源管理上的一些错误,防范 Cross DLL problem.
19.设计class 就像 设计一个新 type
需要考虑以下几个问题:
1)新type的对象应该如何被销毁和创建
2)对象的初始化和赋值应该有什么样的区别
3)对象如果被pass by value 意味着什么?copy构造函数应该注意一下指针的copy
4)新type的合法值
5)新type需要配合某个继承体系
6)新type需要什么转换
7)什么操作符和函数对于此新type是合理的
8)什么样的标准函数应该被驳回(声明为Private)
9)谁该取用新type成员,哪些是public,哪些是private
10)什么是新type的未申明接口
11)新type有多一般化
12)真的需要一个新type吗
20.以pass-by-reference-to-const 代替 pass-by-value
当一个derived class对象被pass by value 以base class 那么base class的copy 构造会被调用
这会导致该对象的derived部分被切割,结果肯定不好咯
pass by value 会导致多余的构造和析构函数被调用 影响性能
但是STL迭代器,内置类型,函数对象(对象内重载()运算符,使之行为像函数)还是比较适合pass by value
21.需要返回对象的时候,别返回reference
因为reference可能是函数的一个local对象,函数调用结束后,local对象被销毁,reference就没有意义了
22.将成员变量声明为private
成员变量的封装性和 成员变量的内容改变时锁破坏的代码数量 成反比
protected的封装性并不一定比public高,因为它会影响derived class
23 以non-member,non-friend函数代替member 函数
non-member non friend函数并不会增加访问class 内private成分的函数数量
而且把新家的non-member non-friend函数只要写在一个头文件里,然后添加到之前的命名空间里,就可以轻易拓展
而class 的派生无法做到这一点,因为它们无法访问base class的private成分
24。如果所有的参数都需要类型转换,请把函数写成non-member函数
比如operator*(const int a);
如果写在class内,a默认是第二参数,第一参数是this
所以没有办法把两个参数都做隐式转换
而operator * (const A a,const int b);
non-member函数可以把两个参数都做隐式类型转换
25. 写一个不会抛出异常的swap函数
当std::swap效率不高,可以写一个成员swap,再写一个非成员swap,调用前者
使用swap时,应提前写using std::swap。然后不带任何前缀的调用swap
保证swap是全局最合适的
对用户定义类型,全特化std templates是最好的,但不要在std中添加新的东西,毕竟simplest is best
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法