C++类.doc_第1页
C++类.doc_第2页
C++类.doc_第3页
C++类.doc_第4页
C++类.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

类的定义格式类的定义格式一般地分为说明部分和实现部分。说明部分是用来说明该类中的成员,包含数据成员的说明和成员函数的说明。成员函数是用来对数据成员进行操作的,又称为“方法”。实现部分是用来对成员函数的定义。概括说来,说明部分将告诉使用者“干什么”,而实现部分是告诉使用者“怎么干”。类的一般定义格式如下:classpublic:private:;下面简单地对上面的格式进行说明:class是定义类的关键字,是种标识符,通常用T字母开始的字符串作为类名。一对花括号内是类的说明部分(包括前面的类头)说明该类的成员。类的成员包含数据成员和成员函数两部分。从访问权限上来分,类的成员又分为:公有的(public)、私有的(private)和保护的(protected)三类。公有的成员用public来说明,公有部分往往是一些操作(即成员函数),它是提供给用户的接口功能。这部分成员可以在程序中引用。私有的成员用private来说明,私有部分通常是一些数据成员,这些成员是用来描述该类中的对象的属性的,用户是无法访问它们的,只有成员函数或经特殊说明的函数才可以引用它们,它们是被用来隐藏的部分。保护类(protected)将在以后介绍。关键字public,private和protected被称为访问权限修饰符或访问控制修饰符。它们在类体内(即一对花括号内)出现的先后顺序无关,并且允许多次出现,用它们来说明类成员的访问权限。其中,是类定义中的实现部分,这部分包含所有在类体内说明的函数的定义。如果一个成员函数的类体内定义了,实现部分将不出现。如果所有的成员函数都在类体内定义,则实现部分可以省略。下面给出一个日期类定义的例子:classTDatepublic:voidSetDate(inty,intm,intd);intIsLeapYear();voidPrint();private:intyear,month,day;/类的实现部分voidTDate:SetDate(inty,intm,intd)year=y;month=m;day=d;intTDate:IsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);voidTDate:Print();coutYEAR.MONTH.DAYENDL;这里出现的作用域运算符:是用来标识某个成员函数是属于哪个类的。该类的定义还可以如下所示:classTDatepublic:voidSetDate(inty,intm,intd)year=y;month=m;day=d;intIsLeapYear()return(year%4=0&year%100!=0)|(year%400=0);voidPrint()coutYEAR.MONTH.DAYENDL;private:intyeay,month,day;这样对成员函数的实现(即函数的定义)都写在了类体内,因此类的实现部分被省略了。如果成员函数定义在类体外,则在函数头的前面要加上该函数所属类的标识,这时使用作用域运算符:。定义类时应注意的事项1、在类体中不允许对所定义的数据成员进行初始化。2、类中的数据成员的类型可以是任意的,包含整型、浮点型、字符型、数组、指针和引用等。也可以是对象。另一个类的对象,可以作该类的成员,但是自身类的对象是不可以的,而自身类的指针或引用又是可以的。当一个类的对象用为这个类的成员时,如果另一个类的的定义在后,需要提前说明。3、一般地,在类体内先说明公有成员,它们是用户所关心的,后说明私有成员,它们是用户不感兴趣的。在说明数据成员时,一般按数据成员的类型大小,由小至大说明,这样可提高时空利用率。4、经常习惯地将类定义的说明部分或者整个定义部分(包含实现部分)放到一个头文件中详细讲解C+ 类的继承 收藏 一个私有的或保护的派生类不是子类,因为非公共的派生类不能做基类能做的所有的事,就是指在公开场合,但是在类内部可以的 一、引言在C+中,类是提供封装的逻辑单位,类的每一个对象都包含有描述其自身状态的数据集合,并且通过接收特定的消息来处理这个数据集合。如果程序设计人员能够通过增加、修改或替换指定类的部分内容的方法对该类进行剪裁,就可以适应不同的应用,从而在很大程度上增强了数据封装的价值,而接下来要讨论的继承就完全可以实现这种操作。二、与继承有关的基本概念继承是一个进程,通过继承,一个对象可以获得另一个对象的属性(包括函数),并可向其中加入属于自己的一些特征。作为C+语言的一种重要机制,用继承的方法可以自动为一个类提供来自另一个类的操作和数据结构,进而使程序设计人员在一个一般的类的基础上很快建立一个新的类,而不必从零开始设计每个类。当一个类被其他的类继承时,被继承的类称为基类(可不是鸡肋_),又称为父类。继承其他类属性的类称为派生类,又称为子类。一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属性,派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在的类继承的实质就是建造新的派生类。三、单重继承、多重继承与继承链从一个基类派生的继承称为单继承,换句话说,派生类只有一个直接基类。单继承声明语句的常用格式为:class 派生类名: 访问控制关键字 基类名 数据成员和成员函数声明; 与此相对地,从多个基类派生的继承称为多继承或多重继承,也就是说,一个派生类有多个直接基类。在某些面向对象的语言(如Java)中不支持类间的多重继承而只支持单重继承,即一个类至多只能有一个直接父类,因此实现类似的功能需要借助接口等其他机制。而在C+中提供了多重继承的语法支持,使得问题变得简单了许多。多重继承声明语句的常用格式为:class 派生类名: 访问控制关键字 基类名1, 访问控制关键字 基类名2,. 数据成员和成员函数声明; 除了多重继承之外,一个派生类继承多个基类还有一种方法,就是把派生类作为基类再次供别的类继承,产生多层次的继承关系。例如类A派生类B,类B派生类C,则称类A是类B的直接基类,类B是类C的直接基类,类A是类C的间接基类。类的层次结构也叫做继承链。还是上面的例子,当建立类C的对象时,类A的构造函数最先被调用,接下来被调用的是类B的构造函数,最后是类C的构造函数。析构函数的调用顺序正好相反。当一个派生类继承有层次的类时,继承链上的每个派生类必须将它需要的变量传递给它的基类。四、公有派生和私有派生在继承声明语句中,访问控制关键字用于说明在基类定义中所声明的成员和成员函数能够在多大范围内被派生类所访问。访问控制关键字可为public, private或protected。如果访问控制关键字为public,则称派生类从基类公有继承,也称公有派生。如果访问控制关键字为private,则称派生类从基类私有继承,也称私有派生。现在笔者将公有继承和私有继承的具体区别列表如下。通过上表,我们可以将两种派生的特点总结如下:基类成员 基类private成员 基类public成员 派生方式 private public private public 派生类成员 不可见 不可见 可见 可见 外部函数 不可见 不可见 不可见 可见 (1)无论哪种派生方式,基类中的private成员在派生类中都是不可见的。也就是说,基类中的private成员不允许外部函数或派生类中的任何成员访问。(2)public派生与private派生的不同点在于基类中的public成员在派生类中的访问属性:public派生时,基类中的public成员相当于派生类中的public成员。private派生时, 基类中的public成员相当于派生类中的private成员。因此,private派生确保基类中的方法只能被派生类的对象的方法间接使用,而不能被外部使用。public派生使派生类对象与外部都可以直接使用基类中的方法,除非这些方法已经被重新定义。五、保护成员与保护派生如果想做到基类成员只由有派生血缘关系的成员访问,而不被无血缘关系的对象成员访问,无论用公有派生还是私有派生都无法做到。因为基类成员中的私有成员是别的类(包括派生类)成员不能访问的,而基类中的公有成员在public派生时,不仅可以由派生类对象成员访问,也可以由外部函数访问;而在private派生时,基类中的公有成员虽然允许派生类对象中的成员访问,不允许外部访问,可是再派生出下一级时,由于基类的所有成员已经被私有化,其它类成员也不可再访问。实现只许有派生血缘关系的对象成员访问的方法,是在基类中使用具有另一种访问属性的成员protected成员。protected成员是一种血缘关系内外有别的成员。它对派生对象而言,是公有成员,可以访问;对血缘关系外部而言,与私有成员一样被隐藏。此外,除了允许使用private与public两种派生方式之外,C+还允许使用protected派生方式。现在将三种访问属性不同的成员经三种派生后在派生类中访问属性的变化情况总结如下表,是对上一表格的增进和补充。派生方式 基类的public成员 基类的protected成员 基类的private成员 派生方式引起的访问属性变化概括 private派生 变为private成员 变为private成员 不可见 基类中的非私有成员都成为派生类中的私有成员 protected派生 变为protected成员 变为private成员 不可见 基类中的非私有成员在派生类中的访问属性都降一级 public派生 仍为public成员 仍为protected成员 不可见 基类中的非私有成员在派生类中的访问属性保持不变 需要注意的是,基类的private成员无论经过何种派生,在派生类中都是不可见的。六、友元类和友元函数(1)友元函数通常,类的私有成员只能由本类的成员访问,外部函数只能访问类的成员函数,再由成员函数访问类的私有成员。但是,如果在某个类定义中用friend声明了一个外部函数(也许是其他类的一个成员)后,这个外部函数便可以例外地访问该类的任何私有成员。用friend声明了的外部函数称为这个类的友元函数。当友元函数是另一个类的成员函数时,应当注意以下几点:A:友元函数作为一个类的成员函数时,除应当在它所在的类定义中声明之外,还应当在另一个类中声明它的友元关系,声明语句的格式为:friend 函数类型 函数所在类名:函数名(参数列表);B:友元函数在引用本类对象的私有成员时无需本类对象的引用参数,但在引用生命它是友元的类的对象中的私有成员时必须有友元类对象的引用参数。C:一个类的成员函数作另一个类的友元函数时,必须先定义,而不是仅仅声明它。使用友元函数直接访问对象的私有成员,可以免去再调用类的成员函数所需的开销。同时,友元函数作为类的一个接口,对已经设计好的类,只要增加一条声明语句,便可以使用外部函数来补充它的功能,或架起不同类对象之间联系的桥梁。然而,它同时也破坏了对象封装与信息隐藏,使用时需要谨慎小心。(2)友元类也可以把一个类而不仅仅是一个函数声明为另一个类的友元类。这时,只需先声明它而不一定需要先定义。应当注意,友元关系是单向的,并且只在两个类之间有效。即使类X是类Y的友元,类Y是否是类X的友元也要看类X中是否有相应的声明。即友元关系不具有交换性。若类X是类Y的友元,类Y是类Z的友元,也不一定就说明类X是类Z的友元,即友元关系也不具有传递性。当一个类要和另一个类协同工作时,使一个类成为另一个类的友元类是很有用的。这时友元类中的每一个成员函数都成为了对方的友元函数。本文来自CSDN博客C+类继承关系问题 在C+中继承主要有三种关系:public、protected和private。这三种继承关系中public继承是最为常用的一种继承关系,代表了接口继承含义,而他们分别具体代表了什么含义呢?1. public 从语义角度上来说,public继承是一种接口继承,根据面向对象中的关系而言就是,子类 可以代替父类完成父类接口所声明的行为,也就是必须符合“Liskov替换原则(LSP)”, 此时子类可以自动转换成为父类的接口,完成接口转换。 从语法角度上来说,public继承会保留父类中成员(包括函数和变量等)的可见性不变, 也就是说,如果父类中的某个函数是public的,那么在被子类继承后仍然是public的。 2. protected 从语义角度上来说,protected继承是一种实现继承,根据面向对象中的关系而言就是, 子类不能代替父类完成父类接口所声明的行为,也就是不符合“Liskov替换原则(LSP)”, 此时子类不能自动转换成为父类的接口,就算通过类型转换(static_cast和dynamic_cast) 也会得到一个空指针。 从语法角度上来说,protected继承会将父类中的public可见性的成员修改成为protected 可见性,相当于在子类中引入了protected成员,这样一来在子类中同样还是可以调用父 类的protected和public成员,子类的子类就也可以调用被protected继承的父类的protected 和public成员。 例如: class CSample1 protected: void printProtected() public: void printPublic() ; class CSample2 : protected CSample1 ; class CSample3 : public CSample2 void print3() printProtected(); printPublic(); ;3. private 从语义角度上来说,private继承是一种实现继承,根据面向对象中的关系而言就是, 子类不能代替父类完成父类接口所声明的行为,也就是不符合“Liskov替换原则(LSP)”, 此时子类不能自动转换成为父类的接口,就算通过类型转换(static_cast和dynamic_cast) 也会得到一个空指针。 从语法角度上来说,private继承会将父类中的public和protected可见性的成员修改成为 private可见性,这样一来虽然子类中同样还是可以调用父类的protected和public成员, 但是在子类的子类就不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论