ASPNET程序设计教案.doc_第1页
ASPNET程序设计教案.doc_第2页
ASPNET程序设计教案.doc_第3页
ASPNET程序设计教案.doc_第4页
ASPNET程序设计教案.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

ASP.NET程序设计教案第4章 C#基础课题第4章 C#基础章节课时2教学目的要求本章主要讲解C#的基础知识,为Web应用程序的开发打好语言基础。C#是从C和C+发展而来,它继承了C+和Java语言的优点,是面向对象的高级程序设计语言,它具有功能强大和语言简洁高效、与Web技术紧密结合、完整的安全和错误处理机制等特点。教学重点类和类的使用及流程控制教学难点类的概念教学环境多媒体教室板书设计4.1 C#简介C#是微软.NET开发平台下的编程语言,是.NET开发平台的核心。微软的.NET为开发程序开创了新的局面,使开发网络程序变得简单,该平台也提供一种更为强大有效的Web服务,通过丰富的类库可以使程序员快速开发所需要的程序。4.1.1 C#语言的特点C#是专为.NET开发平台而设计的编程语言,C#与.NET紧密结合,.NET的各种优点通过C#体现出来,但是C#没有自己的运行库,C#作为.NET的服务提供者之一,它使用.NET的类库,这些类库也为.NET平台的其他开发语言提供支持,这正是.NET开发平台的突出特点。C#语言的最大特色去掉了C/C+中的指针,在C#中,对类、方法的引用变得简单,只有一个“.”符,可理解为通过“.”符实现了类或方法的嵌套。C+语言是面向对象编程语言,从C+发展而来的C#当然也是面向对象开发语言,C#只允许单继承,不支持多继承。因此,不能定义虚基类,这就使类的定义和继承变得简单,这与C+不同,而且C#中不允许定义全局变量和全局函数。C#与Web技术紧密结合,C#通过SOAP(Simple Object Access Protocol)实现了应用程序的解决方案与Web标准相统一。有了Web服务框架的帮助,程序员能够利用已有的面向对象编程知识与技巧开发Web服务,而这一过程用的语言是C#语言。C#具有完善的安全性和错误处理,在C#中消除了软件开发中易犯的错误,并提供完整的安全机制,另一方面C#能以更少的代码实现同样的功能。.NET平台提供了垃圾自动回收,来完成资源的释放与对象撤销时内存的回收工作。C#还支持版本控制技术,具有较好的灵活性及兼容性等优点。4.1.5 一个C#应用程序 这里以创建和编译一个控制台程序为例,介绍使用C#命令行编译器编译应用程序的方法。该程序的功能是在执行后显示“Hello World!”,程序代码如下: using System; namespace MyFirst public class HelloWorld public static void Main ( ) Console.WriteLine(“Hello,World!”); 以扩展名.cs保存文件,这里取MyFirst.cs。如果使用微软提供的visual C#命令行编译器可用以下命令:csc MyFirst.cs,这样会生成一个MyFirst.exe可执行程序。输入命令行执行该程序会输出“Hello World!”。代码分析:首先强调C#对大小写敏感。这里using、namespace、class、public、static、void和Main都是C#保留字,using System指引System命名空间,每一个命名空间可看作是同类对象的一个集合,内部包含很多个类。程序员要自己定义命名空间就要用保留字namespace,本例中自定义了一个命名空间MyFirst。Main方法是应用程序的入口,Main的M要大写,这与C/C+不同。本章的例子程序都已在.NET2003开发环境下正确运行。4.2.2 引用类型引用类型包括类(class)、接口(interface)、代表(delegate)和数组(array)。 类 在面向对象设计方法中,类是一系列具有相同性质的对象的抽象,类是一个数据结构,将对象的属性(状态)和方法(行为)统一在一个单元中,是对对象共同特征的描述。以学生为例,所有学生都有学号、姓名、性别、年龄、所属系别、联系电话等,将这些共同的特征和一些方法定义在一个模板中就构成了学生类,如果这个学生类中指定了具体的值,如“200011070,张亮,男,20,计算机科学系,67698623”,这就是学生类的一个实例,或者叫对象。对象是类的一个实例。类和对象是密切相关的,没有脱离对象的类,也没有不依赖类的对象。类支持继承机制,通过继承和派生类可以扩展类的数据成员和函数成员,从而达到代码复用的目的。有关类的详细情况将在第5节中详细叙述。下面是一个名为Myclass的简单类的声明:例4.3 程序清单P4-3 public class point public int x, y ; public point(int x , int y) this . x = x ; this . y = y ; 使用new创建类的一个对象,为该对象分配内存, point p1 = new point(5 , 15)创建类的一个对象必须使用关键字new来进行声明,而对于结构变量可以使用直接声明,也可以使用new进行创建,因为结构是值类型,类是引用类型。对于值类型,每创建一个变量,就在内存中开辟一块区域,而对于引用类型,每个变量只存储目标的引用,当系统新建一个引用变量时,就增加一个指向目标的指针。当不再需要对象时,该对象所占内存将被系统自动回收,在C#中不准显式地释放对象,这与Java一样。关于类的详细介绍将在第4节中叙述。 接口上面讲过类是一系列具有相同性质的对象的抽象,而接口是定义一个约定,是对一组能够提供相同服务的类的抽象,接口对程序中的各个类进行分组。接口通过关键字interface进行定义。接口支持多继承(multiple inheritance)。在下面的示例中,接口CComboBox同时继承了接口CtextBox和接口ClistBox: interface Cdraw void paint( ) ; interface CTextBox : Cdraw void SetText (string text) ; interface CListBox : Cdraw void SetItems (string items) ; interface CcomboBox : CtextBox , ClistBox 这里只对接口进行概念性介绍,详细介绍将在后面阐述。 代表代表类似于C+编程语言中的函数指针,但与函数指针不同,代表是面向对象和类型安全的。用来封装某个方法的调用过程。代表delegate是关键字,它所封装的方法一定要与某个类或对象相关联。代表将方法处理为实体,使其能够被赋值给变量,并作为参数传递。代表的使用分3步:定义、实例化和调用。如: delegate int w1(string text) ; delegate void w2( );代表的实例化使用new来完成,同时还需要指定所封装的方法,如: WL td = new W2( ) ;这样td就是系统定义的类System delegate的一个扩展。例4.4 程序清单P4-4 using System; delegate string Delegate_one( ) ; / 声明一个代表 public class MyDelegate public string MyDelegate_Normal( ) return “non-static delegate revoked.”; public static string MyDelegate_static( ) return “static delegate revoked.”; public class Myclass public static void Main ( ) MyDelegate MyDele = new MyDelegate( ) Delegate_one d=new Delegate_one(MyDele. MyDelegate_Normal); Console.WriteLine(d( ); d=new Delegate_one(MyDelegate. MyDelegate_static); Console.WriteLine(d( ); 该程序输出结果为:non-static delegate revoked. static delegate revoked.4.3 变量和参数变量是用来描述一条信息名称,可用变量来表示和存储各种类型的信息。变量代表存储地址,当定义了一个变量后,系统会给该变量分配一定的存储空间,因此变量在使用之前必须先定义。C#中定义了7种类型的变量:静态变量、实例变量、数组元素、值参数、引用参数、输出参数和局部变量。C#中对变量的命名要求有:1) 变量名必须以字母开头。2) 变量名只能由字母,数字,下划线组成,不能包含空格,标点符号,运算符号等。3) 变量名不能使用C#中的关键字(如using , int等)。4) 变量名不能使用C#中库函数名称(如Main , write等)。在C#中如果在关键字,库函数名前加“”作为一个变量命名则是合法的,但不推荐使用这种方式来命名一个变量。在变量命名中应尽量体现变量的性质、内容等信息的名字,应尽可能做到见名识义,这样利于程序的阅读。另外,可以在一条语句中命名多个变量,如 int a , b , c=2 , d ;在面向对象程序设计中由访问修饰符来对变量进行访问限制,C#提供了下面几种访问修饰符:1) public:表示对变量的访问不受任何限制。2) protected:表示可以在类的内部访问该变量。3) protected:表示只能在包含变量的类或类生类中对变量进行访问。4) internal:表示变量的访问范围只能在当前工程或模块内。5) private:表示变量的访问只能在包含它的类中。6) static:表示变量为静态变量。7) ref:表示变量为形式参数变量。变量的数据类型为C#中对应的关键字。如: class demo public static int x; int y; void Fun(int a, ref int b, int v, out int c) int i=2 ; c=a+b- ; x是静态变量,y是实例变量,a是值参数,b是引用参数,v 1 是数组元素,c是输出参数,i是局部变量。1) 静态变量。用static修饰符声明的变量为静态变量。所谓静态变量指变量只需创建一次,在后面的程序中可以多次引用。如果类中的一个成员变量被定义为静态的,那么类中的所有成员都可以共享这个变量。静态变量的初始值就是该变量类型的默认值。2) 实例变量。未用static修饰符声明的变量为实例变量。当个类的实例被创建后,直到实例在内存中被释放,该实例变量就一直存在。3) 局部变量。指在一个独立的程序中声明的变量,它只在该程序块中有效,程序离开这个范围变量就失效。如for循环语句中控制循环次数的变量。局部变量不会被自动初始化,因此,它没有默认值,在其有效范围内也同样要先声明后使用。4) 值参数。未用ref或out修饰符声明的参数为值参数。值参数在调用该参数所属的函数成员时开始存在,并用调用中给定的自变量的值初始化。5) 引用参数。用ref修饰符声明的参数是引用参数。变量作为引用参数在函数成员调用之前必须先赋值,在函数成员内部,引用参数被视为已赋值。在结构类型的实例方法或实例访问器内部,关键字this的行为与该结构类型的引用参数相同。6) 输出参数。用out修饰符声明的参数是输出参数。输出参数不会被保存到新的存储位置。变量作为输出参数在函数成员调用中传递之前不一定要显式赋值。在函数成员内部,输出参数被视为未赋初始值。函数成员的每个输出参数在该函数返回前都必须明确赋值。关键字this的行为与该结构类型的输出参数相同。7) 常量。C#中可用两种方式来定义常量,常数常量和只读常量。常数常量使用关键字const来定义,要求在定义时赋值。如: public const double pi=3.141592;这样定义pi为常量后,对常量pi的操作只能是读,不能对pi进行修改。常数常量通常为值类型,如果是引用类型必须在初始化时为其赋予null值。在定义常量时,可以使用修饰符new , public , protected , internal和private进行限制。只读常量使用关键字readonly来定义。只读常量的值在程序运行中第一次使用时被确定,只读常量前加修饰符static表示是静态的,不加static表示为非静态只读常量。只读常量只能读取常量的值,不允许对其进行修改。4.4 流程控制通常情况下,程序中的代码是顺序执行的,若要改变代码的执行顺序,就要使用流程控制,流程控制语句分为3类:1) 条件控制:以特定的值或表达式决定是否执行程序分支,使用的关键字有if和switch等。2) 循环控制:使重复执行某段程序代码,使用的关键字有while, do, for, foreach等。3) 跳转控制: 使程序转移执行,使用的关键字有goto, break, continue等。4.4.1 条件控制当程序中需要有两个或两个以上的选择时,可以使用条件语句判断要执行的语句段。C#提供两种选择语句:一种是条件语句,即if语句,另一种是开关语句,即switch语句。它们都可以用来实现多路分支,从一系列可能的程序分支选择要执行的语句。 if语句if语句根据布尔类型的表达式的值选择要执行的语句,该语法结构与C/C+一样,最简单的if语句只设置一条选择路径,语法为if(布尔表达式) if(布尔表达式) expression;该结构中当表达式的值为true时,执行大括号里的表达式,否则语句结束。如果大括号里的语句只有一行,大括号可以省略,这种结构称为单if结构流程图。用ifelse结构的选择语句语法为: if(布尔表达式) expression-1; else expression-2; 如果布尔表达式值为true,执行expression 1,否则执行expression2。当需要实现多条选择路径的时候,可以用ifelse语句中嵌入多个else if分支,结构为: if(布尔表达式-1) expression-1; else if(布尔表达式-2) expression-2; . . . else expression-n; 当布尔表达式-1的值为True时,执行expression-1,执行完后if语句结束;否则若布尔表达式-2的值为True时,则执行语句expression-2,执行完后if语句结束;以此类推,如果以上条件都不成立,则执行最后一个else语句后的expression-n。else分支总是与最近的一个if语句配对。例如:if(x) if(y) f( ); else G(x)等价于下面的语句 if(x) if(x) f( ); else G(x) 先输入一个成绩,然后用ifelse语句进行判断,判断该成绩等级。例4.10 程序清单P4-10 using System; namespace P4_10 class test public static void Main ( ) double x=85.7; if(x=90) Console.WriteLine(优); else if(x=80) Console.WriteLine(良); else if(x=70) Console.WriteLine(中); else if(x60 & x70) Console.WriteLine(及格); else Console.WriteLine(不及格); 程序输出结果是:良 Switch语句当判断的条件相当多时,使用else if语句会使程序变得难以阅读,这时使用switch语句进行操作就十分方便,switch根据一个表达式的多个可能取值来选择执行的代码段。 switch(判断对象) case 常量表达式-1; statement-1; break; case 常量表达式-2; statement-2; break; . default: statement-n; break; switch语句的控制类型由switch表达式建立。如果switch表达式类型sbyte , byte , short , ushort , int , uint , long , ulong , char , string或枚举类型,这就是switch语句的控制类型。也可以是用户定义隐式转换语句把switch表达式类型转换为switch语句的控制类型。每个switch语句最多只能有一个default分支,也可以没有。switch语句执行规则如下:1) 计算出switch表达式的值并转换为主导类型。2) 如果switch表达式的值等于某一个switch分支的常量表达式的值,那么程序将转换到这个case标号后的语列表中。3) 如果switch表达式的值无法与switch语句中任何一个case常量表达式相匹配,并且有default分支,则程序会跳转到default标号后的语列表中。4) 如果switch表达式的值无法与switch语句中任何一个case常量表达式相匹配,并且没有default分支,则程序会跳转到switch语句的结尾。例4.11 程序清单P4-11 using System; namespace P4_11 class switch_Test static void Main ( ) Console.WriteLine(请输入5分制一个分数); switch (Console. ReadLine( ) case “5”: Console.WriteLine(优); break; case “4”: Console.WriteLine(良); break; case “3”: Console.WriteLine(中); break; case “2”: Console.WriteLine(及格); break; case “1”: Console.WriteLine(不及格); break; 4.4.2 循环语句循环语句可以实现程序的重复执行,C#提供4种循环语句:while语句,dowhile循环语句,for语句和foreach语句,程序员可根据实际需要进行选择。 while循环语句while循环语句的语法格式为: while(布尔表达式) statement; 其执行顺序为:1) 先计算布尔表达式的值。2) 若值为true则执行语句statement然后重新执行步骤1)。3) 若布尔表达式的值为false则结束循环。while循环中程序代码可能执行0次,也可能执行多次。布尔表达式一定是一个布尔运算式,不能是一个整数值。程序清单用while循环,从1加到100,当i大于100时退出循环。例4.12 程序清单P4-12 using System; namespace P4_12 class sum public static void Main ( ) int i=0 ; int s=0; while(i=100) s+=i; i+; Console.WriteLine(“s=0”,s); 该程序的执行结果为:s=5050在while语句中可以使用break语句结束循环;也可以用continue语句来停止执行本次循环,继续进行下一次的while循环。例如显示除5以外的8以内的正整数。例4.13 程序清单P4-13 using System; class mytest public static void Main ( ) for(int i=1; i=8 ; i+) if(i=5) continue; Console.WriteLine(i); 程序输出结果为:1 2 3 4 6 7 8如果将continue改为break,则仅显示出14的数。例4.14 程序清单P4-14 using System; class mytest public static void Main ( ) for(int i=1; i=10; i+) if(i=5) break; Console.WriteLine(i); 程序输出结果为:1 2 3 4从上面两个简单的例子不难看出break和continue的用法。foreach循环语句foreach循环语句是C#中独有的循环语句。它对于处理数组和集合等数据类型的运算特别简便。foreach语句用于列举集合中的每一个元素,并且通过执行循环体对每一个元素进行操作。foreach的语法格式为: foreach(数据类型 变量 in 集合表达式) 循环体;如果集合表达式是数组,对于一维数组按递增的顺序从0到Length-1遍历数组元素,对于多维数组,先从右到左维度的索引开始递增遍历。例如,先建立一个数组对象myarray,并添加几个元素,然后用foreach来存取myarray中的元素。例4.17 程序清单P4-17 using System; namespace P4_17 class mylist public static void Main ( ) int myarray=new int8; for(int i=0; i8; i+) myarrayi=i; foreach(int var in myarray) Console.WriteLine(var+“ ”); 该程序的执行结果为: 0 1 2 3 4 5 6 74.4.3 跳转控制跳转控制主要用来实现程序的跳转来改变程序的执行顺序。C#中的跳转语句主要有goto,语句,break语句, continue语句,return语句。 break语句和continue语句break语句主要用于switch、while、dowhile、for或foreach等语句中,用来中断当前的选择或循环并跳出当前的选择或循环语句。具体应用参见程序P4-14。continue语句主要用于while、dowhile、for或foreach等这些循环语句中,用于结束本次循环,即跳过continue语句后面尚未执行的语句,但并未跳出循环体,接着执行下一次循环的判定。4.4.4 异常处理程序在执行时,可能会发生一些不可预测的错误或异常。比如发送电子邮件过程中,突然网络不通,这时就要采用异常处理来解决这种异常或错误。在C#中,所有的异常都由System . Exception派生的,当出现异常或错误时,编写中止异常或错误代码放在finally块中。C#中存在下列两种情况会产生异常:1) 在C#语句和表达式处理过程中激发了某个异常条件,使得操作无法正常结束产生异常。2) throw语句抛出异常。异常是由try语句处理,try语句有以下三种形式: Trycatch tryfinally trycatchfinally trycatch语句C#语言通过try语句的控制机制来检测代码中的异常并做出相应的处理,正常情况try代码中的语句依次执行,而catch代码段不会被执行,当出现异常时就执行catch语句进行异常处理。一个try语句可以有多个catch语句,如果两个catch语句所捕获的异常类有继承关系,那么要保证派生类的catch语句在前,基类的catch语句在后,否则,派生异常类的catch语句失效。4.5 类 在面向对象的程序设计中,类是面向对象程序设计的核心,它实际是用于定义一种新的数据类型(引用类型)。类是对某一类对象的抽象;而对象是某一种类的实例,因此,类和对象是密切相关的。没有脱离对象的类,也没有不依赖于类的对象。C#与C+的类区别在于不支持多重继承,但通过多重接口(interface)可实现多重继承。 4.5.1 类声明类声明是一个类型声明,C#类的一般声明格式如下: 类修饰符 class 类的成员定义(类体); ;其中,class是定义类的关键字,是标识符,类的成员定义包含数据成员和函数成员两部分定义。类修饰符包括:new、public、protected、internal、private、abstract和sealed。其中:1) new只允许出现在嵌套类中,它表明一个类通过相同的名称隐藏了一个继承的同名成员。2) public、protected、internal和private类修饰符控制类的访问能力。类修饰符默认为public,public表示外界不受限制的访问该类;protected类修饰符表示只能从所在的类和其派生的子类访问;internal类修饰符表示本应用程序可以访问该类;private类修饰符表示该类只有在定义它的类中可以访问。3) abstract定义抽象类,说明该类是一个不完整的类,只有声明而没有具体实现。一般只能用来作为其他类的父类。4) sealed修饰符说明不能从该类派生出另一种类。例4.22 程序清单P4-22 using System; namespace P4_22 public class employee private int No; private string name; private char sex; private string address; public employee(int n, string na, char s, string addr) No=n; name=na; sex=s; address= addr; public void disp_employee() Console.WriteLine(职工号:0 职工姓名:1 , No, name); Console.WriteLine(性别:0 住址:1 , sex, address); public static void Main() employee emp=new employee(200501,王海,男,郑州市); emp.disp_employee( ); 该程序的执行结果为: 职工号:200501 职工姓名:王海 性别:男 住址:郑州市该公有类employee类声明了四个数据成员(No、name、sex和address)和函数成员(一个与类同名的构造函数和disp_employee( )、Main( )方法)。4.5.2 对象的创建声明类后,需要通过new关键字创建类的实例(也就是对象)。类的实例相当于一个引用类型的变量。创建类实例的格式如下: 类名 实例名=new类名(参数);new关键字调用类的构造函数来完成实例的初始化工作。例如: employee p1=new employee(9901, 王海, 男,广州市中山大道西109号);也可以使用下述两条语句: employee p1; p1=new employee(9901, 王海, 男, 广州市中山大道西109号);4.6 方法一个方法是表现对象或类行为的成员函数。4.6.1 方法定义方法定义格式: 方法修饰符 返回类型 方法名(形式参数列表) 方法实现部分; 方法修饰符包括:new、public、protected、internal、private、abstract、sealed及static、virtual、override和extern修饰符。方法的返回类型指定返回值的数据类型。如果方法不返回值,那么返回类型就是void。4.6.2 方法参数方法的参数被方法的形式参数列表所声明。方法有四种形式参数:1) 数值参数,它不用任何修饰符声明。2) 引用参数,它用ref修饰符声明。3) 输出参数,它用out修饰符声明。4) 参数数组,它用params修饰符声明。4.6.4 静态方法和非静态方法静态方法属于类所有,是所有对象实例公用的方法,只能用类名调用静态方法。它不属于某一个具体的对象实例,因此,静态方法中没有隐含的this,也就是说我们不能通过this获得调用该方法的对象。既然找不到这个对象实例,我们不能在其中访问该对象实例的成员,这和非静态方法是不一样的。类的静态方法中不能直接访问类的非静态成员而只能访问类的静态成员,类的非静态方法可以访问类的所有成员和方法,因为静态方法属于类,而非静态方法属于类的实例。例:演示静态方法和非静态方法的规则。例4.29 程序清单P4-29 using System; namespace P4_29 class Test private int x; static private int y; public void Fn() / 非静态方法 x = 1; / 相当于 this.x = 1 y = 1; / 相当于Test.y = 1 Console.WriteLine(x = 0; y=1 , x , y); public static void Gn() /静态方法 /x = 2; / Error, 静态方法不能访问非静态成员x y = 2; Console.WriteLine( y=0 , y); static void Main() Test t = new Test(); t.Fn(); Test.Gn(); t.x = 2; / Ok /t.y = 1; / Error, 不能通过实例访问静态成员 /Test.x = 1; / Error, 不能通过类名访问实例成员 Test.y =2; / Ok Console.WriteLine(x = 0; y=1 , t.x , Test.y); string a1; a1=Console.ReadLine(); 这个例子产生下面的输出: x=1;y=1 Y=2 x=2;y=24.6.5 方法的重载所谓方法重载就是指同一个方法名有多个不同的实现方法。具体地讲,定义方法重载时要求方法的参数或者至少有一个类型不同,或者个数不同。而对于返回值的类型没有要求,可以相同,也可以不同。那种参数个数和类型都相同,仅仅返回值不同的重载定义是非法的。因为编译程序在选择相同名字的重载定义时仅考虑参数表,这就是说要依赖方法的参数表中参数个数或参数类型的差异进行选择。由此可以看出,方法重载的意义在于它可以用相同的名字访问一组相互关联的方法,由编译程序来进行选择,因而这将有助于解决程序复杂性问题。如在定义类时,构造函数重载给初始化带来了多种方式,为用户提供更大的灵活性。例:求体积volume方法中使用重载。例4.30 程序清单P4-30 using System; namespace P4_30 public class TestMethod public double volume (double x) /立方体体积 return x*x*x; public double volume (double r, double h) /圆柱体体积 return Math.PI*r*h; public double volume (double a, double b, double c) /长方体体积 return a*b*c; public static void Main() TestMethod t1=new TestMethod(); Console.WriteLine(Cube volume = 0 , t1. volume (2.5); Console.WriteLine(Cylinder volume = 0 , t1. volume (2,4); Console.WriteLine(Cuboid volume = 0 , t1. volume (5,3,4); 这个例子产生下面的输出: Cube volume = 8 Cylider volume = 31.4159265358979 Cuboid volume = 244.6.6 运算符重载运算符重载就是赋予已有的运算符多重含义。C#中通过重新定义运算符,使它能够用于特定类的对象执行特定的功能,这便增强了C#语言的扩充能力。运算符重载还使程序更加简洁,使表达式更加直观,增加可读性。重载运算符注意以下几项:1) 不可造新的运算符。必须把重载运算符限制在C#语言中已有的运算符范围内的允许重载的运算符之中,主要有:*,+,-,/,+,!,=,=,&,%,%,-。不能重载的运算符有=, ., ?:, -, new, is, sizeof, typeof。2) 重载运算符坚持4个“不能改变”。(1) 不能改变运算符操作数的个数。(2) 不能改变运算符原有的优先级。(3) 不能改变运算符原有的结合性。(4) 不能改变运算符原有的语法结构。3) 重载操作符必须是public和static 修饰的,否则会引起编译错误。例:定义一个复数类,并对+,+运算符重载。例4.31 程序清单P4-31 using System; namespace P4_31 class Complex double r, v; /r+ v i public Complex(double m, double n) r=m; v=n; public static Complex operator +(Complex a, Complex b) return new Complex(a.r+b.r, a.v+b.v); public static Complex operator +(Complex a) double r=a.r+1; double v=a.v+1; return new Complex(r, v); public void Print() Console.WriteLine(r+ + +v+i); class Test public static void Main

温馨提示

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

最新文档

评论

0/150

提交评论