C++ 创建类时常考虑的问题

本文仅以c++为例,简要说明创建一个类时我们需要考虑的问题。创建一个新类实际上就是定义一 个新的数据类型,因此设计类需要当做类型设计来对待的,c++的设计者在设计语言的内置类型时是经过深思熟虑的,当然我们新设计类时也需要这样来对待,那么我们具体会思考什么样的问题呢?
继承
- 将这个类添加到现有继承层次结构中是否合适?
- 应该使用公有继承还是私有继承?
应该支持多继承吗?这样会影响哪些成员函数设置为虚函数。
组合
相对于直接使用继承,将一个关联的对象作用数据成员是否更合适?
抽象接口
- 打算将该类设计为抽象基类以使子类重写各个虚成员函数吗?
标准设计模式
- 能否在类的设计中使用众所周知的设计模式?
- 使用设计模式能够从前人深思熟虑的、精妙的设计方法学中获益,也使设计更容易被其他工程师使用。
初始化与析构模型
- 对象的创建于删除是否让客户通过 new 和 delete 实现,还是用工厂方法管理?
- 是否要为知己的类重载 new 和 delete 定制内存分配行为?
- 是否需要使用智能指针?
定义复制构造函数和赋值操作
- 如果这个类中分配了动态内存,那么这两个都是需要定义的(当然,析构函数也需要定义)这会影响对象的复制和安值传递等行为。
模板
- 设计的类是定义了一族类型还是一种类型?如果是一族类型的话,则可以考虑使用模板是设计一般化。
const和explicit
- 尽可能将参数、返回值和方法定义为 const。
- 对于单参数构造函数使用 explicit 关键字以避免意外的类型转换。
操作符
- 定义类需要的操作符,如 +、*=、[]、==或<< 等。
类型转换操作符
- 考虑是否希望设计的类自动转换为其他类型并声明适当的转换操作符。
友元
- 友元会破坏类的封装,友元的出现往往是设计变坏的征兆。不到万不得已不要使用。
非功能性约束
- 如性能和内存使用情况这类的问题也会约束类的设计
C++ 创建类时常考虑的问题的更多相关文章
- JS创建类和对象
JavaScript 创建类/对象的几种方式 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活 ...
- JS创建类和对象(好多方法哟!)
http://www.cnblogs.com/tiwlin/archive/2009/08/06/1540161.html 这是别人写的~~~我借来看看 JavaScript 创建类/对象的几种方式 ...
- JavaScript 创建类/对象的几种方式
在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的. JS对象是一种复合类型,它允许你通过变量 ...
- JS创建类和对象,看完了,头就不大了
JavaScript 创建类/对象的几种方式 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活 ...
- 设计模式之创建类模式大PK
创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...
- 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值
前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...
- ios动态创建类Class
[Objective-C Runtime动态加载]---动态创建类Class 动态创建类Class,动态添加Class成员变量与成员函数,动态变量赋值与取值,动态函数调用等方法 a.使用objc_al ...
- python动态创建类的声明
动态创建类的声明 使用内置函数type,原型:class type(name, bases, dict)name是类的名字,相当于__class__bases是类的基类,元组,可以有多个基类,但是基类 ...
- C# 利用反射根据类名创建类的实例对象
“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...
随机推荐
- Java多线程—JUC原子类
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIn ...
- Ajax与Controller的参数交互
理论 jQuery.ajax( options )中重要参数设置 jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据.通过jquery.ajax与SpringMVC的C ...
- [Training Video - 4] [Groovy] Function in detail
Employee.log=log Employee e1 = new Employee() Employee e2 = new Employee() e1.name = "A" e ...
- 轻松搭建持续集成工具jenkins
1.Jenkins介绍1)什么是持续集成随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软 ...
- 用Collections升降排序
//期末从业人员 总收入 资产总计等 升降 排序 if("qmcyry".equals(sss)){ if("desc".equals(orders)){ Co ...
- 开发高性能的MongoDB应用—浅谈MongoDB性能优化(转)
出处:http://www.cnblogs.com/mokafamily/p/4102829.html 性能与用户量 “如何能让软件拥有更高的性能?”,我想这是一个大部分开发者都思考过的问题.性能往往 ...
- [GO]channel实现数据交互
package main import ( "fmt" "time" ) func main() { ch := make(chan string)//创建ch ...
- 编写高质量代码改善C#程序的157个建议——建议94:区别对待override和new
建议94:区别对待override和new override和new使类型体系应为继承而呈现出多态性.多态要求子类具有与基类同名的方法,override和new的作用就是: 如果子类中的方法前面带有n ...
- Python3常见Exception
异常 描述BaseException 新的所有异常类的基类Exception ...
- WorkFlow 工作流 学习笔记
传统ERP为制造业企业产供销人财物的管理提供了一整套优化企业资源利用,集物流.信息流.资金流为一体的现代化管理工具.但是它在过程集成和企业间集成方面存在不足.具体表现在: 1.传统ERP是一个面向功能 ...