C_程序设计及应用教程(WHUT课件)第4章_面向对象编程基础.ppt_第1页
C_程序设计及应用教程(WHUT课件)第4章_面向对象编程基础.ppt_第2页
C_程序设计及应用教程(WHUT课件)第4章_面向对象编程基础.ppt_第3页
C_程序设计及应用教程(WHUT课件)第4章_面向对象编程基础.ppt_第4页
C_程序设计及应用教程(WHUT课件)第4章_面向对象编程基础.ppt_第5页
已阅读5页,还剩38页未读, 继续免费阅读

下载本文档

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

文档简介

1、第4章 面向对象的编程基础,4.1 类 4.2 结构 4.3 方法 4.4 属性与索引器,4.1 类,类与对象 类:一组具有相同数据结构和相同操作的对象的集合。 例如:汽车 对象(实例):类的实例化 。例如:卡车 注意:要使用对象,必须先定义类,然后再创建对象。 对象的生存周期 对象在建立时分配了内存,创建对象实际上作了两个方面的工作: (1)使用new保留字要求系统分配内存; (2)使用构造函数初始化数据。 销毁对象也是做了两个方面的工作: (1)释放占用的内存; (2)将分配给对象的内存归还给堆(Heap)。,4.1 类的组织,1.类的声明 用class定义类,声明类的形式为: 附加声明

2、访问修饰符 class 类名称:基类 ,接口序列 字段声明 构造函数 方法 事件 ,注意:中的内容可省或任选其一,当两者都有时,先基类后接口,4.1 类的组织(续),例题4-1 public class Child private int age; private string name; / 不带参数的构造函数 public Child() name = none; / 带参数的构造函数 public Child(string name, int age) ,如果不指明,则 默认为private,4.1 类的组织(续), = name; this.age = age; /

3、输出方法 public void PrintChild() Console.WriteLine(0, 1 years old., name, age); public class Program ,4.1 类的组织(续),public static void Main() /使用new关键字创建对象,new后是调用的构造函数 Child child1 = new Child(Zhang San, 11); Child child2 = new Child(Li Si, 10); Child child3 = new Child(); / 显示结果 Console.Write(Child #1:

4、 ); child1.PrintChild(); Console.Write(Child #2: ); child2.PrintChild(); Console.Write(Child #3: ); child3.PrintChild(); Console.ReadLine(); ,4.1 类的组织(续),输出结果: Child #1: Zhang San, 11 years old. Child #2: Li Si, 10 years old. Child #3: none, 0 years old.,4.1.2 构造函数,作用:构造函数是一个特殊的方法,用于在建立对象时 进行初始化的动作。

5、 好处:确保每一个对象在被使用之前都适当地进行了初始化的动作。 构造函数特点: 1) 每个类至少有一个构造函数。若程序代码中没有构造函数则系统会自动提供一个默认的构造函数。 2) 一个构造函数总是和它的类名相同。 3) 构造函数不包含任何返回值。 4) 构造函数总是public的。 一般在构造函数中作初始化工作,对于执行过程用时比较长的程序代码,最好不要放在构造函数中。,4.1.2 构造函数(续),1、默认构造函数 (1)如果在类中不定义构造函数,系统会提供一个默认的构造函数。 (2)默认构造函数没有参数。 (3)默认构造函数自动将非静态成员初始化为: 数值型:如int、double等,初始化

6、为0。 bool类型:初始化为false. 引用类型:初始化为null。 (4)如果自己定义了类的构造函数,则所有初始化工作由编程者自己完成。,4.1.2 构造函数(续),2. 重载构造函数 有时候可能会遇到这样的情况:在一个类中的多个方法中都要用到某一个数据成员,而该成员值必须从其他类中传递过来。这时,无参数的构造函数就不能胜任了,解决这个问题最好的办法就是:重载(Overloading)构造函数。,4.1.2 构造函数(续),例题4-2 using System; using System.Collections.Generic; using System.Text; namespace

7、OverloadingExample class Program public Program() Console.WriteLine(null); ,4.1.2 构造函数(续),public Program(string str) Console.WriteLine(str); static void Main() Program aa = new Program(); Program bb = new Program(How are you!); Console.ReadLine(); ,4.1.3 字段和局部变量,为了区分作用域不同的变量,C#对变量进行了更细的划分:字段、局部变量。声明

8、变量的位置不同,其作用域不同。 字段Field: 指声明为类一级的对象或值类型的变量。 局部变量:指在方法、事件以及构造函数内声明的变量。 public class Program public static int j=20; /字段,这个地方就是类型级,紧挨着类的声明 public static void Main() int j=30; /方法中声明,局部变量,局部变量必须初始化 Console.WriteLine(j); /输出结果:30 Console.WriteLine(Program.j); /输出结果:20 Console.ReadLine(); ,4.1.3 字段和局部变量,

9、字段的作用域是整个类,本类中的所有属性、方法等都可以访问该字段 局部变量是属于一个函数或语句块的,它的作用域是从定义开始,到离开语句块。 当字段和局部变量名相同时: 如果要引用静态字段,可以使用下面的形式: 类名.字段名 如果是实例字段,则使用下面的形式: this.字段名 这里的this指当前实例。 当然,如果没有出现字段和局部变量名重名的情况,引用字段的形式和引用局部变量的形式相同。 例题4-3,4.1.4 静态成员与实例成员,类的成员包括数据成员和成员函数 -字段、属性、方法、构造函数、事件、索引、嵌套类。 成员分静态成员和非静态。静态成员实现同一类的所有对象共享。 静态成员特点: 类的

10、成员分静态成员和实例成员 静态成员在内存中只有一份 静态成员要等到应用程序结束时才会从内存中清除。 非静态成员特点: 非静态成员即实例成员 把只有创建了类的实例才能够使用的成员叫实例成员。,4.1.5 访问修饰符,C#中有以下成员访问修饰符: Public (常用)任何外部的类都可以不受限制的存取这个类的方法和数据成员。 private (常用)类中的所有方法和数据成员只能在此类中使用,外部无法存取。(默认) Protected 除了让本身的类可以使用之外,任何继承自此类的子类都可以存取。 Internal 在当前项目中都可以存取。该访问权限一般用于基于组件的开发,因为它可以使组件以私有方式工

11、作,而该项目外的其它代码无法访问。 Protected internal 只限于当前项目,或者从该项目的类继承的类才可以存取。 Partial pr()l部分 局部类型,类的定义和实现可以分布在多个文件中,但都要使用partial标注,基类只需要声明一次,若多次声明则必须完全一致。,4.2 结构,结构(struct)是由一系列相关的、但类型不一定相同的变量组织在一起而构成的数据表示形式,所有结构类型都隐式地从类型object继承。 例如:public struct Point public int x; public int y; 结构和类的区别与联系: 结构类型是值类型,类类型是引用类型。

12、凡是定义为结构的,都可以用类来定义。 创建轻量级对象时,可以使用结构。 例题4-4,4.3 方法,方法(Method)是一组程序代码的集合,每个方法都有一个方法名,便于识别和让其他方法调用。 1. 方法的定义与使用 (1)方法必须放在某个类中。 (2)定义方法的语法形式为: 访问修饰符 返回值类型 方法名称(参数序列) 语句序列 ,4.3 方法(续),定义方法时,需要注意以下几点: 方法名不能和变量、常数或者任何声明在类中其它的成员相同。 方法可以有参数,也可以没有参数,但是不论是否有参数,小括号都是必需的。如果参数序列中的参数有多个,则以逗号分开。 结束某个方法的执行,可以使用return语

13、句,程序遇到return语句后,会将执行流程交还给调用此方法的程序代码段。此外,还可以用return语句返回一个值。 如果声明一个非void类型的方法,则方法中必须至少有一个return语句。,4.3 方法(续),例题4-5 using System; class Program public int MyMethod() Console.WriteLine(this is MyMethod.); int i = 10; return i; static void Main() Program method = new Program(); int j = 5; j = method.MyMe

14、thod(); Console.WriteLine(the value is 0., j); ,4.3 方法,2. 方法中的参数传递 1) 传递值类型的参数 值类型参数的格式为: 参数类型 参数名 例题4-6 class Program public static void AddOne(int a)a+; static void Main() int a = 3; Console.WriteLine(“调用AddOne之前,a=0”, a); /3 AddOne(a); Console.WriteLine(调用AddOne之后,a=0, a); /3 Console.ReadLine();

15、,4.3 方法(续),2) 传递引用类型的参数 引用类型参数的格式为: ref 参数类型 参数名 例题4-7 class Program public static void AddOne(ref int a) a+; static void Main() int a = 3; Console.WriteLine(调用AddOne之前,a=0, a);/3 AddOne(ref a); Console.WriteLine(调用AddOne之后,a=0, a);/4 Console.ReadLine(); ,4.3 方法(续),3) 输出多个引用类型的参数 输出引用类型参数的格式为: out 参

16、数类型 参数名 在方法的输入参数前面加上out关键字时,传递给该方法的变量可以不初始化。该变量通过引用传送。 例题4-8 class Program public static void MyMethod(out int a, out int b) a = 5; b = 6; static void Main() int x, y; MyMethod(out x, out y); Console.WriteLine(调用MyMethod之后,x=0,y=1, x, y); /5,6 Console.ReadLine(); ,4.3 方法(续),4) 传递个数不确定的参数 需要传递的参数个数不确

17、定时,可以采用params关键字,其后一般跟一个数组。 例题4-9 class Program public static float Average(params long v) long total, i; for (i = 0, total = 0; i v.Length; +i) total += vi; return (float)total / v.Length; ,4.3 方法(续),static void Main() float x = Average(1, 2, 3, 5); Console.WriteLine(1、2、3、5的平均值为0, x); x = Average(

18、4, 5, 6, 7, 8); Console.WriteLine(4、5、6、7、8的平均值为0, x); Console.ReadLine(); ,4.3 方法(续),3. 方法重载 方法重载是指具有相同的方法名,但参数类型或参数个数 不完全相同的多个方法可以同时出现在一个类中。 例题4-10 using System; class Program public static int Add(int i, int j) return i + j; public static string Add(string s1, string s2) return s1 + s2; public st

19、atic long Add(long x) return x + 5;,4.3 方法(续),static void Main() Console.WriteLine(Add(1, 2); Console.WriteLine(Add(1, 2); Console.WriteLine(Add(10); /按回车键结束 Console.ReadLine(); ,4.4 属性与索引器,属性Property为类提供了一种很有用的封装数据的方法。它提供灵活的机制来读取、编写或计算某个私有字段(数据成员)的值。属性是一种成员。属性可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。 属性的作用:使内部数

20、据和外界获取相分离,内部数据的更改不会影响到外界的取得;可以限制外部对类中成员变量的存取权限。 属性使类能够以一种公开的方法获取和设置封装数据的值,同时隐藏实现或验证代码。 属性组成: get 属性访问器:用于返回属性值 set 访问器用于分配新值 不实现 set 取值函数的属性是只读的,4.4 属性与索引器,1.属性的声明和定义 get:用来读取数据成员的值。 set:用来设置数据成员的值。 public class MyClass private int number = 0; public int MyNumber getreturn number; setif (value 0) nu

21、mber = value; /value是关键字,用于定义由 set 取值函数分配的值,其值由编译器自动生成。 ,4.4.1 属性(续),public class Program public static void Main() MyClass me = new MyClass(); Console.WriteLine(me.MyNumber); me.MyNumber = 5; Console.WriteLine(me.MyNumber); Console.ReadLine(); 例题4-11,C#中类的字段,方法和属性的区别,类的字段:类的数据成员,其定义是:用于存储类和类的实例相关数据

22、的变量。 方法:就是类的函数成员,是一个为实现类的某一个特定功能的函数。 属性:实质上是类的一个函数成员(方法)。对类的属性的设定和获取可以用两个访问器set和get来实现。 从概念上可以区分字段和属性的区别,字段是一个用于存储数据的变量,属性是一个方法或者说是一个函数成员。 属性和字段的不同: 属性并没有保存物理数据,不直接存储数据,所以不能把属性当作参数传递给方法。而字段可以。 大多数情况下字段的访问修饰符均为 private,如果修饰符为 public,那么在类之外都可以访问该字段,但不建议这样做,应该通过属性或方法来访问类中的数据。 属性和方法的区别: 方法中包含访问器把类中的字段暴露

23、给外面,属性基本是为了在类的外部对私有变量的值进行读/取。 把所有的字段都设为私有字段,如果要暴露它们,则把它们封装成属性。这也是微软推荐的方式。,class MyClass /数据成员或者字段的定义 public int iTemp = 10; private int iTestValue; /属性的定义 public int MyValue set /设定属性 iTestValue= value; get /从属性获取值 return iTestValue; ,/方法的定义 public void SetValue(ref int iValue) TheRealValue = iValue

24、; public int GetValue() return TheRealValue; ,4.4.2 索引器,索引器(indexer)用于封装内部集合或数组。 索引器在语法上方便了程序员将类、结构或接口作为数组进行访问。索引器允许类或结构的实例按照与数组相同的方式进行索引。 索引器类似于属性,不同之处在于它们的访问器采用参数。它可以使得像数组那样对对象使用下标。 要声明类或结构上的索引器,需要使用this关键字。 例如: public int thisint index / 索引器声明 / get and set accessors ,在本示例中,定义了一个泛型类,并为其提供了简单的get和

25、set访问器方法(作为分配和检索值的方法)。 class SampleCollection private T arr = new T100; public T thisint i get return arri; set arri = value; get 访问器返回值。 set 访问器分配值。 this 关键字用于定义索引器。 value 关键字用于定义由 set 索引器分配的值。,Program 类为存储字符串创建了此类的一个实例。代码如下: 下面是如何使用上述代码实现的索引器,具体代码示例如下: class Program static void Main(string args) S

26、ampleCollection s = new SampleCollection(); s0 = 索引器的使用; System.Console.WriteLine(s0); ,4.4.2 索引器,【例4-12】索引器的声明和用法。,索引器与属性类似。除下表中显示的差别外,为属性访问器定义的所有规则同样适用于索引器访问器。,4.5 类及成员总结,1-类和结构 类和结构都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。类定义了每个类对象(称为实例)可以包含什么数据和功能。 结构与类的区别: 内存中的存储方式:类是存储在堆(heap)上的引用类型,而结构是存储在堆栈(stack)

27、上的值类型。 其他:如结构不支持继承。 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,较小的数据类型使用结构可提高性能。 对于类和结构,都使用关键字new来声明实例:这个关键字创建对象并对其进行初始化。,2-类的成员 类中的数据和函数称为类的成员。Microsoft的正式术语为数据成员和函数成员。 除了这些成员外,类还可以包含嵌套的类型(例如其他类)。 类中的所有成员都可以声明为public(此时可以在类的外部直接访问它们)或private(此时,它们只能由类中的其他代码来访问)。 数据成员 数据成员包含了类的数据- 字段、常量和事件。数据成员可以是静态数据(与整个类相关)或实例数据(

28、类的每个实例都有它自己的数据副本)。通常,对于面向对象的语言,类成员总是实例成员,除非用static进行了显式的声明。 字段是与类相关的变量。使用const关键字来声明常量。事件是类的成员,客户可以包含所谓事件处理程序的代码来响应该事件。,函数成员 函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和终结器(finalizer)、运算符以及索引器。 方法是与某个类相关的函数,它们可以是实例方法,也可以是静态方法。实例方法处理类的某个实例,静态方法提供了更一般的功能,不需要实例化一个类(例如Console. WriteLine()方法)。 属性按属性指定的get方法和Set方法对字段

29、进行读写。 构造函数是在实例化对象时自动调用的函数。构造函数用于初始化字段的值。 终结器是在CLR检测到不再需要某个对象时调用。它们的名称与类相同,但前面有一个符号。程序员应注意,终结器在C#中用得少得多,因为CLR会自动进行垃圾收集,另外,不可能预测什么时候调用终结器。 运算符执行的最简单的操作就是+和-。 索引器允许对象以数组或集合的方式进行索引。 在C#中,函数成员不仅包含方法,而且也包含类或结构的一些非数据成员,例如索引器、运算符、构造函数和析构函数等,甚至还有属性。这些都不是数据成员,字段、常量和事件才是数据成员。,3-Object类 所有的.NET类都派生于System.Objec

30、t。 如果在定义类时没有指定基类,编译器就会自动假定这个类派生于Object。前面介绍的每个类都派生于System.Object(对于结构,这个派生是间接的:结构总是派生于System.ValueType,System.ValueType派生于System.Object)。 System.Object方法 ToString()方法:是获取对象的字符串表示的一种便捷方式。 GetHashTable()方法:如果对象放在名为映射(也称为散列表或字典)的数据结构中,就可以使用这个方法。 Equals()(方法:比较对象相等性 Finalize()方法:析构函数,在引用对象被回收,以清理资源时调用。 GetType()方法:这个方法返回从

温馨提示

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

最新文档

评论

0/150

提交评论