C++类设计过程中的原则(总结)

一、由编译器生成的成员函数

1)默认的构造函数

默认构造函数定义为没有参数,或者有默认的参数值。当用户自己未定义时,系统可以提供。

自动生成的默认构造函数,会调用继承的基类的默认构造函数来构造派生类的基类部分。

若Star是一个类,则

Star orig;

Star array[6];都将需要默认构造函数。

如果自己定义了构造函数,则系统不会再生成默认构造函数,这个时候最好自己要定义一个默认构造函数。

构造函数 --
【确保对象的生成】 -- 最好提供显式的默认构造函数,以确保对象能够正确的初始化为合理值。

2)复制构造函数

Star类的复制构造函数圆形如下:

Star(const Star &)

通常,我们会在一下情况下用到复制构造函数:

* 将新对象初始化为一个同类对象

* 函数按值传递对象参数

* 函数返回对象(而不是对象的引用)

* 生成临时对象

如果自己没有显式的定义复制构造函数,编译器将会自动生成一个其原型(但不提供函数定义??),以使得新对象的的每个成员初始化为原始对象相应的成员。

但是,当出现需要深度复制的情况时(使用new构造成员),或者需要修改的静态变量,这个时候一定要自己定义复制构造函数!!

例如:

string(const string & s)

{

// new char []

}

3)赋值运算符

在同类对象之间进行赋值操作,但不要把赋值和复制初始化混淆!!

【如果语句创建新对象,一般是复制初始化构造;语句修改已有对象,则是赋值】

Star orig;

Star pre = orig;
// copy ctor

Star post;

post = pre;
// copy assignment

赋值运算符返回对象的引用(使得可以连续赋值)。

orig = pre = post;

这是string类的赋值运算符重载:(见《C++
string类字符串的常用操作及实现
》,同时实现“自我赋值”和"异常安全处理")

string & string::operator=(const string &) const ;

二、类设计的其它注意事项

1)构造函数不能够被继承(使用),只有自己需要生成对象时被使用。继承的派生类构造函数,会调用基类的构造函数。

2)析构函数,在使用new动态生成成员变量是一定要显式定义析构函数;当基类中存在virtual或者pure virtual时,将析构函数也定义为virtual。

3)转换构造函数,如果你不希望出现隐式的类型转换,使用【explicit】声明函数,但仍然可以使用显式的强制转换。

例如:

explict string(const char *);

4)按值传递和按引用传递

我们知道,一般情况下在类设计中都是用按引用传递,按值传递会隐式的调用复制构造函数和析构函数,在返回大型类时极其影响效率。可以节省时间和内存!!

按引用传递的另外原因:在继承使用虚函数时,被定义接受基类引用的参数可以接受派生类的引用。

5)const的使用

尽可能的使用const,但要注意场合。确保const参数在传递过程中不会修改其属性(常量),【可以将非const传给const参数,但禁止将const传给非const】。

三、共有继承的注意事项

1)IS-A关系式典型的基类 - 派生(is a king of),HAS-A有种接口的赶脚,接口的实现(is implemented as a),用友元函数实现(uses a)。纯自己的感觉,有误请指正。

2)基类的构造函数、析构函数和(一般情况下)赋值函数都不能继承。可以将派生类赋值给基类,反过来则maybe。

3)对于公共用户,使用保护成员和私有成员一样;对于派生类而言,使用保护乘员和公有成员一样。

派生类可以直接访问保护乘员,但只能通过基类的共有方法访问私有成员,相对来讲私有成员具有更好的安全性。

保护成员则可以简化编码,提高访问速度,但是这会使得派生类直接访问和修改基类的保护成员。

【使用私有成员比保护成员更好(尽可能的使用),但是保护方法很有用】

4)虚方法

设计基类时将方法定义为虚,使得【多态】派生类能够重新定义方法,这样可以使用【动态联编】。

纯虚函数使得类ABC【只定义接口,不涉及实现】,不能生成真正的对象。

5)友元函数

友元函数不是类的方法,因此不能够继承,在派生类中需要重新定义。

如果要使用基类的friend 函数,一般我们会使用【强制转换】,将派生类的指针或者引用转换成基类的指针或引用。

-- 【C++ Primer Plus】温习小结。

C++类设计过程中的原则(总结)

时间: 2024-10-05 11:31:21

C++类设计过程中的原则(总结)的相关文章

界面设计过程中的常用字体规范

好长时间没发帖,净想过年了,过年哈,倒腾工作总结和年货是大事. 这几天有人问我说:“最近看了好多教程,都老高大上了,但是老弟我做不到呀,想学点直接能拿来用的,这个要求过分吗……” 这个,好吧,那就直接说说能用的知识:字体字号. 也许你会说:字体字号?也太Low了吧,这个谁不知道重要呀. 对于这个问题,我想说:会和熟练,是两回事.一个App,不同部分的字体字号你能准确地说出来吗? 很多刚做APP界面的设计师,经常会因为字号,字体颜色,间距而困扰. 拿到设计需求后,开始进行设计,不知道从何去调整界面

Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用

以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类Manager ,验证在类继承过程中equals().hashcode().toString()方法的使用.package equals;public class EqualsTest{    public static void main(String[] args){        Employ

PF2.1版本总结,在设计过程中遇到的问题以及技术分享

在距离上一次的版本发布已经过去4个月的时间,因为个人的能力以及时间有限,所以这次的版本会推迟这么久.可是无论怎样,PF2.1带着自身的完善总算不负所望推出.在这次的版本调整中让我深有体会到了程序设计中的几大问题:安全.性能.稳定.如何设计出一个高效稳定的框架时,自然需要对所运用的语言的熟知,在这期间我一直参考了<effective c++>这本对C++语言总结的十分详细的资料,结合了最新C++11的新特性. 版本更新 1.增加:cache模块 2.增加:lua插件中的dcache模块 3.增加

面向对象的设计过程的一些原则

程序设计原则: 综合考虑,开发Schedule,质量要求完成架构设计 基本面有(MindSet) 面向接口编程(依赖接口,而非实现) 分层设计,松散耦合. 开闭原则:对修改关闭,对新增开放(具体操作可以通过配置,反射等方法实现) 接口隔离原则(保证接口的单一性,避免大杂烩) 多态替换原则(子类Override父类的方法不能修改其功能,即保持抽象父类和各种子类方法的功能都相同) 考虑程序交互IO(保证特定吞吐量的使用效率) 前期必须考虑程序的扩展性,维护性已经伸缩性 基本类的设计要点: 单一 强内

浅谈企业应用软件架构设计过程

1.引言 本文不是学术性文章,也不是某些标准化理论的阐述,而是根据所从事J2EE应用软件架构设计工作的经验,谈谈自己对软件架构设计过程的理解,希望能让一些徘徊于门口的同学能对企业应用软件架构设计的目标.价值与方法有个大致概念.文中所举例子及分析方法受个人经验背景约束,可能在一定程度上会存在误导性,软件架构设计过程大同小异,例子主要还是用于辅助说明设计过程. 对于架构设计,如果用建筑来比拟的话,有点类似这样:这是我们将修建一座大教堂,甲方有这样的一些特殊要求,比如大堂要能容纳5000人,中间不能有

真屏实据丨数据大屏设计实战—揭秘企业级数据大屏设计过程

本文来自网易云社区 作者: 魏辛逸 图片: "网易有数"可视化平台 大屏是我们用来分享.沟通.传播信息的有效途径之一.它将会进化成一种新的媒体形式,在品牌推广.政务接待.商业沟通.数据监控等各个场景发挥重要作用.本文主要整理了一些大屏设计过程中的方法和原则,希望能够为大家提供一些借鉴思路. 大屏是什么? 大屏设计是最近比较流行的概念,一般按照功能来分有几种: 1. 可交互的触摸屏,大多运用在互动教学课程或者报告演示现场,用户可结合交互操作来阐述具体内容.设计师需要对交互形式和传达内容作

从涂鸦到发布——理解API的设计过程(转)

英文原文:From Doodles to Delivery: An API Design Process 要想设计出可以正常运行的Web API,对基于web的应用的基本理解是一个良好的基础.但如果你的目标是创建出优秀的API,那么仅凭这一点还远远不够.设计优秀的API是一个艰难的过程,如果它恰巧是你当前的工作任务,那么你很可能会感到手足无措. 不过,优秀的设计绝对是可以实现的.本文所描述的流程将帮助你获得成功,我们将共同研究什么是优秀的设计,以及迭代式的流程如何帮助我们实现这一目标.我们还将叙

产品设计开发的一般原则

一.以市场为导向 任何产品的开发,其目的意义都在于走入市场.创造价值及收益.因此,产品设计开发laisj.com的方向就必须以市场方面的需求为依据来确定,而市场需求又分为两类:一类是短期市场需求,一类是长期市场发展的方向.对于短期需求,有的产品在当前有很大的需求量,但技术含量不高或属过度性需求,在经过一段热潮之后,将有新一代产品将其代替.有的是在一定长的时间内,由于成本或技术原因.不可能被其它产品替代.对瞄准远期前景的产品市场,一些是高技术含量,现在已有明显的发展趋势,另一些是无竞争企业,高附加

MYSQL数据库设计之字段选择原则

关于字段的选择其实很多地方都有进行详细的介绍,我这里只写一下我在使用过程中的心得感受.如果想要全面的了解的话,大家可以去看高性能MYSQL这一本书籍,里面有一章节介绍的特别全面,基本涉及MYSQL中全部的字段的介绍. 我这里给大家介绍的就一些常用的字段,例如:int.float.double. decimal.varchar.char. date.datetime等八种常用的类型. 在数据库设计过程中我们要本着够用的原则,如果一味的把数据字段范围设为最大或者默认值的话,会导致存储空间大量的浪费.