本文仅以c++为例,简要说明创建一个类时我们需要考虑的问题。创建一个新类实际上就是定义一 个新的数据类型,因此设计类需要当做类型设计来对待的,c++的设计者在设计语言的内置类型时是经过深思熟虑的,当然我们新设计类时也需要这样来对待,那么我们具体会思考什么样的问题呢?

继承

  • 将这个类添加到现有继承层次结构中是否合适?
  • 应该使用公有继承还是私有继承?
  • 应该支持多继承吗?这样会影响哪些成员函数设置为虚函数。

    组合

  • 相对于直接使用继承,将一个关联的对象作用数据成员是否更合适?

抽象接口

  • 打算将该类设计为抽象基类以使子类重写各个虚成员函数吗?

标准设计模式

  • 能否在类的设计中使用众所周知的设计模式?
  • 使用设计模式能够从前人深思熟虑的、精妙的设计方法学中获益,也使设计更容易被其他工程师使用。

初始化与析构模型

  • 对象的创建于删除是否让客户通过 newdelete 实现,还是用工厂方法管理?
  • 是否要为知己的类重载 newdelete 定制内存分配行为?
  • 是否需要使用智能指针?

定义复制构造函数和赋值操作

  • 如果这个类中分配了动态内存,那么这两个都是需要定义的(当然,析构函数也需要定义)这会影响对象的复制和安值传递等行为。

模板

  • 设计的类是定义了一族类型还是一种类型?如果是一族类型的话,则可以考虑使用模板是设计一般化。
  • const和explicit

  • 尽可能将参数、返回值和方法定义为 const
  • 对于单参数构造函数使用 explicit 关键字以避免意外的类型转换。

操作符

  • 定义类需要的操作符,如 +、*=、[]、==或<< 等。

类型转换操作符

  • 考虑是否希望设计的类自动转换为其他类型并声明适当的转换操作符。

友元

  • 友元会破坏类的封装,友元的出现往往是设计变坏的征兆。不到万不得已不要使用。

非功能性约束

  • 如性能和内存使用情况这类的问题也会约束类的设计

C++ 创建类时常考虑的问题的更多相关文章

  1. JS创建类和对象

    JavaScript 创建类/对象的几种方式 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活 ...

  2. JS创建类和对象(好多方法哟!)

    http://www.cnblogs.com/tiwlin/archive/2009/08/06/1540161.html 这是别人写的~~~我借来看看 JavaScript 创建类/对象的几种方式 ...

  3. JavaScript 创建类/对象的几种方式

    在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的. JS对象是一种复合类型,它允许你通过变量 ...

  4. JS创建类和对象,看完了,头就不大了

    JavaScript 创建类/对象的几种方式 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活 ...

  5. 设计模式之创建类模式大PK

                                        创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...

  6. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  7. ios动态创建类Class

    [Objective-C Runtime动态加载]---动态创建类Class 动态创建类Class,动态添加Class成员变量与成员函数,动态变量赋值与取值,动态函数调用等方法 a.使用objc_al ...

  8. python动态创建类的声明

    动态创建类的声明 使用内置函数type,原型:class type(name, bases, dict)name是类的名字,相当于__class__bases是类的基类,元组,可以有多个基类,但是基类 ...

  9. C# 利用反射根据类名创建类的实例对象

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...

随机推荐

  1. C++细节理解

    1.为什么static类外初始化不需要static关键字 答:因为类外static变量或函数表示限定在此源文件中才能使用,而类中的static变量或函数表示由本类及其所有对象共享,如果在类外初始化或定 ...

  2. phpmailer配置qq邮箱

    function send_email2($email = '*****@perspectivar.com'){ $this->autoRender = false; date_default_ ...

  3. [JAVA] 小数转百分数

    import java.text.NumberFormat; //获取格式化对象 NumberFormat format = NumberFormat.getPercentInstance(); // ...

  4. python CSV 文件的读写

    1.CSV文件 import csv with open(r"E:\code\0_DataSet\tianchi_2015_mobile_recommand\fresh_comp_offli ...

  5. ADT

    1.什么是antant是构建工具2.什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3.ant的好处跨平台   --因为 ...

  6. centos7设置、查看、删除环境变量的方法

    centos查看环境变量与设置环境变量在使用过程中很常见,本文整理了一些常用的与环境变量相关的命令,感兴趣的朋友可以参考下希望对你有所帮助 1. 显示环境变量HOME(红色部分代表要输入的命令,不要把 ...

  7. Java书籍经典Top10

    1)Java Language Specification, Third Edition (by James Gosling) 本书由Java技术的发明者编写,是Java TM编程语言的权威性技术指南 ...

  8. ASP.NET MVC WebApi接口授权验证

    对于很任何多开发者来说,不管是使用任何一种框架,或者是使用任何一种语言,都要使用面向接口编程.使用面向接口编程的时候,那么就会有很多的权限验证,用户验证等等. 特别是对于一些系统来说,别人想要对接你的 ...

  9. src.rpm格式的RHCS源码提取

    RHCS源码下载(地址1:地址2) 参考文档(RHCS安装也配置) RHCS源码提取(参考) 方法一: (1)rpm –ivh magma-plugins-1.0.15-3.src.rpm   执行r ...

  10. Discovering Gold LightOJ - 1030 (概率dp)

    You are in a cave, a long cave! The cave can be represented by a 1 x N grid. Each cell of the cave c ...