Item 19:把类的设计视作类型设计 Effective C++笔记
2015-08-31 18:20
381 查看
Item 19: Teat class design as type design.
在面向对象语言中,开发者的大部分时间都用在了增强你的类型系统。这意味着你不仅是类的设计者,更是类型设计者。 重载函数和运算符、控制内存分配和释放、定义初始化和销毁操作……良好的类型有着自然的语法、直观的语义,以及高效的实现。 你在定义类时需要像一个语言设计者一样地小心才行!
类的设计就是类型设计,当你定义一个类之前,需要面对这些问题:
这个新的类型如何创建和销毁?
初始化和赋值之间又怎样的区别?它们确实是不同的函数调用,参见:Item 4:确保变量的初始化
如果该类型的对象被传值而不是传引用,意味着怎样的语义?记住:传值时调用的是拷贝构造函数!
该类型合理的取值范围是?在你的成员函数、赋值和构造函数中需要做相应的范围检查!
你的新类型能融合到继承图中吗?如果你继承自已有的类,你的类将被它们限制(尤其是虚函数限定);如果你希望其他类来继承该类型,那么你的方法是否需要声明为
你的新类型允许怎样的类型转换?你可能需要将构造函数声明为
15:资源管理类需要提供对原始资源的访问
哪些运算符对你的新类型是有意义的?
那些编译器生成的默认方法需要被禁止?参见:Item 6:禁用那些不需要的缺省方法
谁可以访问你的成员方法?私有、保护、共有成员限定符;友元类、友元函数。
你想提供哪些潜在的接口?它们往往关乎异常安全、效率、资源使用等,这些潜在的接口将会影响你的实现。
你的类型有多么通用?如果它是非常通用的类型,你可以考虑通过模板把它定义成一系列的类。
你真的需要这个新的类型吗?如果你为了扩展一个类而继承了它,那么定义一个非成员函数或者模板能否更好地解决问题?
除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/08/12/effective-cpp-19.html
在面向对象语言中,开发者的大部分时间都用在了增强你的类型系统。这意味着你不仅是类的设计者,更是类型设计者。 重载函数和运算符、控制内存分配和释放、定义初始化和销毁操作……良好的类型有着自然的语法、直观的语义,以及高效的实现。 你在定义类时需要像一个语言设计者一样地小心才行!
类的设计就是类型设计,当你定义一个类之前,需要面对这些问题:
这个新的类型如何创建和销毁?
new还是
new []?
初始化和赋值之间又怎样的区别?它们确实是不同的函数调用,参见:Item 4:确保变量的初始化
如果该类型的对象被传值而不是传引用,意味着怎样的语义?记住:传值时调用的是拷贝构造函数!
该类型合理的取值范围是?在你的成员函数、赋值和构造函数中需要做相应的范围检查!
你的新类型能融合到继承图中吗?如果你继承自已有的类,你的类将被它们限制(尤其是虚函数限定);如果你希望其他类来继承该类型,那么你的方法是否需要声明为
virtual?尤其是析构函数。
你的新类型允许怎样的类型转换?你可能需要将构造函数声明为
explicit来避免隐式类型转换。参见:Item
15:资源管理类需要提供对原始资源的访问
哪些运算符对你的新类型是有意义的?
那些编译器生成的默认方法需要被禁止?参见:Item 6:禁用那些不需要的缺省方法
谁可以访问你的成员方法?私有、保护、共有成员限定符;友元类、友元函数。
你想提供哪些潜在的接口?它们往往关乎异常安全、效率、资源使用等,这些潜在的接口将会影响你的实现。
你的类型有多么通用?如果它是非常通用的类型,你可以考虑通过模板把它定义成一系列的类。
你真的需要这个新的类型吗?如果你为了扩展一个类而继承了它,那么定义一个非成员函数或者模板能否更好地解决问题?
除非注明,本博客文章均为原创,转载请以链接形式标明本文地址: http://harttle.com/2015/08/12/effective-cpp-19.html
相关文章推荐
- Visual Studio 2015 memory leak detection
- c语言libcurl 使用实例get/post方法+c语言字符串处理
- 使用 C++ 处理 JSON 数据交换格式
- C++的Json解析库:jsoncpp和boost .
- C++ Template之技巧性基础知识 和 typeid(x).name()用法
- C++ List的用法(整理)
- Java 调用C语言JNI库(Hello World实例)
- C++计算输入数据对应二进制中1的个数。
- LINK : fatal error LNK1158: cannot run 'rc.exe'
- vs工程链接出现error LNK2005...already defined
- vs2012 error LNK2038 RuntimeLibrary 不匹配的解决
- Effective C++ Item2
- C++ Builder XE8 安卓开发之获取WIFI状态
- LINK : fatal error LNK1104: 无法打开文件“kernel32.lib”
- map容器的简单概述及入门的定义和使用方法
- 重载赋值运算符返回reference to *this(Effective C++_10)
- C++--------------------------结构体struct
- C++ 静态数据成员能不能受private控制符的作用
- 《IOS_C语言》程序存储区划分、动态申请内存、内存操作函数
- 前序遍历和中序遍历树构造二叉树