新闻中心

EEPW首页>嵌入式系统>设计应用> 类的封装与继承

类的封装与继承

作者: 时间:2009-12-14 来源:网络 收藏

而合理的做法如下所述。
规则9-3-3(强制): 将成员函数声明为static或者const类型。
这是因为,将成员函数声明为static或者const类型,可以限制对于其非静态数据成员的访问,从而避免无意识下对数据进行的修改。
每一个对象都有和简单变量类似的建立过程,我们希望也能够像对待普通变量那样,当通过声明语句分配内存空间之后,立即写入特定的数据。但由于对象的复杂性以及封装需求决定了直接赋值不可行,为此C++严格规定了初始化程序的接口形式,并有一套自动的调用机制。这里所说的初始化程序就是构造函数,这个特殊的成员函数以及与之对应的析构函数,需要在封装时给予特别的注意。
规则12-1-1(强制): 对象的动态类型不允许在其构造函数或者析构函数体内被调用。
在对象的构造和析构过程中,它最终的类型可能会与完整构造的对象不一样。在构造函数或者析构函数中使用对象的动态类型,将可能与开发人员的预期不一致。对象的动态类型使用在如下的结构中:
◆典型的具有虚函数或者其基类中具有虚函数;
◆dynamic_cast;
◆对于虚函数的虚调用。
此规则同样禁止由构造函数和析构函数产生的对纯虚函数的调用。那样的调用将导致未定义的行为。下面来看一个较为特殊的函数――拷贝构造函数,以结束对封装的讨论。
拷贝构造函数是一种特殊的构造函数,其形参是本类的对象的引用。其作用是使用1个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化1个新的同类的对象。
规则12-8-1(强制): 拷贝构造函数只允许对基类以及它所在类的非静态成员进行初始化。
如果编译器接口发现1个对拷贝构造函数的调用是冗余的,它将忽略该函数调用。即使拷贝构造函数在构造对象之外还有其他功能,也不例外。这称作拷贝省略。因此当修改程序状态的次数不能确定时,保证不使用拷贝构造函数修改程序的状态,就显得极为重要。相关例程如下:

本文引用地址://m.amcfsurvey.com/article/173524.htm


上述例子里,在所有函数调用之后,m_static的数值由使用的是何种编译器来决定,不是明确的值。这种不确定因素很可能带来严重的安全隐患,显然不是我们希望看到的。


3 筹――概念与代码的重复利用
运筹学中一个经典的例子是:用2个锅同时煎鸡蛋,每个鸡蛋要煎2面,每煎1面1分钟,问煎好3个鸡蛋最少要多少时间?对这个简单例子的解决过程反映了我们的思考习惯:面对新事物新问题时,首先考虑的是如何充分利用现有的工具和概念,如果需要的话,在此基础上作尽可能小的改动。与派生就是这种思想在C++中的体现。
按照真实世界的情况,在软件设计中引入了类的概念。同时我们注意到人们的特定思维习惯:当提到两厢小轿车时,遵循着“交通工具→汽车→轿车→两厢小轿车”的具象化过程,而不是从螺丝钉开始想象。对于C++而言,面对新对象,首先想到的不是从成员开始重新构建它,而是去寻找这个新对象与已有对象类别的相似之处,看能不能最大限度利用已经给出定义的类来描述这个新对象。为新对象创建的特殊类,具有一般类的全部属性与服务,称作特殊类对一般类的。1个类可以单独存在,但是当利用机制使用该类时,该类就成为给其他类提供属性和行为的基类,或者成为继承其他类的属性和行为的派生类。
合理使用继承可以显著提高代码的利用率。规则10-1-2(强制): 只有在菱形结构中才允许将基类声明为虚基类。
虚基类会引入许多未定义和潜在的容易令人混淆的特性。因此,只有当该基类在菱形继承结构中作为公共基类时,才可以将其声明为虚基类。



关键词:继承C语言

评论


相关推荐

技术专区

关闭