Effective C++笔记(四):设计与声明
2016-04-19 16:07
274 查看
参考:http://www.cnblogs.com/ronny/p/3747186.html
2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容。
3,“阻止误用”的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
4,shared_ptr支持定制型删除器。这可以防范DLL问题,可以用来自动解除互斥锁。
1,新type的对象应该如何创建和销毁?
影响到的设计函数:构造函数、析构函数以有内存分配函数和释放函数(operator new,operator new[],operator delete,operator delete [])。
2,对象初始化和对象的赋值有什么样的差别?
取决于构造函数和赋值操作符的行为,注意区分初始化和赋值。
说了很多,总之就是要充分考虑。
上面的规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-vaule往往比较适当。
绝对不要返回point或reference指向一个local stack对象(局部对象返回后会被销毁),或返回reference指向一个heap-allocated对象(无法销毁,内存泄露),或返回point或reference指向一个local static对象而有可能同时需要多个这样的对象。
其次封装性,都写成函数进行访问可以提供以后修改访问方法的可能性,而不影响使用方法。另外,public影响的是所有使用者,而protected影响的是所有继承者,都影响巨大,所以都不建议声明成员变量。
切记将成员变量声明为private。这可赋予客户访问数据的一致性、可细微划分访问控制、允诺条件获得保证,并提供class作者以充分的实现弹性。
protected并不比public更具封装性。
特别的,重载运算符操作函数时,如果是双目运算符,这个函数必须是non-member的。
条款18:让接口容易被正确使用,不易被误用
1,好的接口很容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质。2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容。
3,“阻止误用”的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
4,shared_ptr支持定制型删除器。这可以防范DLL问题,可以用来自动解除互斥锁。
条款19:设计class犹如设计type
如何设计高效的类呢?1,新type的对象应该如何创建和销毁?
影响到的设计函数:构造函数、析构函数以有内存分配函数和释放函数(operator new,operator new[],operator delete,operator delete [])。
2,对象初始化和对象的赋值有什么样的差别?
取决于构造函数和赋值操作符的行为,注意区分初始化和赋值。
说了很多,总之就是要充分考虑。
条款20:宁以pass-by-reference-to-const替换pass-by-value
pass-by-value会造成较多的构造函数与析构函数的开销,并且在将派生类传递给基类接口的时候会发生类的切割问题。上面的规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-vaule往往比较适当。
条款21:必须返回对象时,别妄想返回其引用
如果定义一个局部变量,就是在stack空间创建对象;如果该对象由new创建,则是在heap上创建。绝对不要返回point或reference指向一个local stack对象(局部对象返回后会被销毁),或返回reference指向一个heap-allocated对象(无法销毁,内存泄露),或返回point或reference指向一个local static对象而有可能同时需要多个这样的对象。
条款22:将成员变量声明为private
首先是代码的一致性(调用public成员时不用考虑是成员还是函数)。其次封装性,都写成函数进行访问可以提供以后修改访问方法的可能性,而不影响使用方法。另外,public影响的是所有使用者,而protected影响的是所有继承者,都影响巨大,所以都不建议声明成员变量。
切记将成员变量声明为private。这可赋予客户访问数据的一致性、可细微划分访问控制、允诺条件获得保证,并提供class作者以充分的实现弹性。
protected并不比public更具封装性。
条款23:宁以non-member、non-friend替换member函数
宁可拿non-member non-friend函数替换member函数。这样做可以增加封装性、包裹弹性和机能扩充性。条款24:若所有参数皆需要类型转换,请为些采用non-member函数
如果你需要为某个函数的所有参数(包括被this指针所指向的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member。特别的,重载运算符操作函数时,如果是双目运算符,这个函数必须是non-member的。
条款25:考虑写出一个不抛异常的swap函数
如果你提供一个member swap,也该提供一个non-member swap来调用前者,对于classes(而非templates),也请特化std::swap相关文章推荐
- c++中在顺序容器中访问、插入、删除元素的操作
- 第4周 C语言及程序设计提高例程-5 函数的参数
- 学习C++ effective
- C++11 生成指定范围内的随机数
- C++项目之文件的压缩及解压缩
- STL的学习(C++primer)
- 使用SWIG将C++接口转换成Java接口
- 使用grep 在源码文件查找特定字符串
- showFilesName.cpp
- C++ 继承
- leetcode111题 题解 翻译 C语言版 Python版
- c++各容器使用心得
- C语言里栈和堆的区别整理
- 每个数不会超过100位 怎么用C语言写啊 ,谢谢我是一只菜鸟
- 输入十个字符,存放到数组中,然后顺序打印出来。C语言新手
- leetcode112题 题解 翻译 C语言版 Python版
- 初学遗传算法解决tsp问题(C++)
- 先贴出代码C++ 中的单例模式
- 巩固C语言(十一)----文件的数据处理
- C++读书笔记(持续更新)