




已阅读5页,还剩167页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
类和对象-1,崔克彬 ,目录,5.1 类的定义 5.2 对象的定义 5.3 对象的初始化 5.4 成员函数的特性 5.5 静态成员 5.6 友元 5.7 类的作用域 5.8 局部类和嵌套类(自学) 5.9 对象的生存周期,5.1 类的定义,类的定义: 类是一种复杂的数据类型,它是将不同的类型的数据和与这些数据相关的操作封装在一起的集合体。 类是面向对象程序设计的核心 ; 类是一种用户自定义类型,是一种通过抽象数据类型的方法由用户构造的新型的数据类型; 类的结构由其内部数据结构和相关的操作决定,并通过操作接口来描述,操作接口又被称为这类对象向其他对象提供的服务。,5.1 类的定义,类的定义格式: class public: private: ; ,5.1 类的定义,类的定义格式: 说明: 类的成员分为数据成员和成员函数 类的成员的访问权限分三类:公有的(public)、私有的(private)和保护的(protected); public、private和protected被称为访问权限修饰符/访问控制修饰符,说明类或成员的访问权限: 公有成员不仅可以被类的成员函数引用,而且可以在程序中被引用 = 公有成员提供了类的接口功能 私有成员只能被类的成员或友元函数所引用,在程序中不可访问,5.1 类的定义,类的定义格式: 说明: 类的成员函数可以在类体内定义,也可以在类体外定义。当成员函数在类体外定义时,需定义为以下格式: :() : 作用域运算符,用来标识该成员函数属于哪个类。,5.1 类的定义,例5.1:定义一个关于日期的类,类的说明部分: class TDate public: void SetDate(int y,int m,int d); int IsLeapYear( ); void Print( ); private: int year,month,day; ,类中定义了6个类成员: 3个成员函数,3个数据成员,;,5.1 类的定义,例5.1:定义一个关于日期的类,成员函数如果定义在类体外,需要在函数头前加上函数所属的类的标识符,使用作用域运算符:,类的实现部分,类的公有成员可访问类的私有成员,5.1 类的定义,例5.1:定义一个关于日期的类,成员函数如果定义在类体内,则与一般函数的定义一样,类的另一种实现方式,;,5.1 类的定义,注意事项: 在类体内不允许对所定义的数据成员进行初始化操作, 类的数据成员的类型可以是普通的数据类型:整型、浮点型、字符型、数组、指针和引用等,也可以为对象另一个类的对象可以作为该类的成员,该类的指针或引用也可以作为该类的成员,但该类自身的对象不可以作为该类的成员,5.1 类的定义,注意事项:,5.1 类的定义,注意事项:,5.1 类的定义,注意事项: 通常将对于类的说明部分或整个类的定义部分放到一个单独的头文件中: 例如,可将之前定义的TDate类放到名为tdate.h的头文件中,目录,5.1 类的定义 5.2 对象的定义 5.3 对象的初始化 5.4 成员函数的特性 5.5 静态成员 5.6 友元 5.7 类的作用域 5.8 局部类和嵌套类(自学) 5.9 对象的生存周期,5.2 对象的定义,对象是类的实例,类是某一类对象的抽象 对象属于某个已知类,定义对象之前要先定义该对象的类,例: TDate date1,date2,*Pdate,date31;,对象的定义格式: ,5.2 对象的定义,对象成员(数据成员/成员函数)的表示方法: 一般对象: () 例: TDate date1; date1.year,date1.month,date1.day date1.SetDate(y, m, d),5.2 对象的定义,对象成员(数据成员/成员函数)的表示方法: 指向对象的指针: 方式: () 例: TDate Pdate; Pdateyear, Pdatemonth, Pdateday PdateSetDate(y, m, d) 方式: () () () 例: TDate *Pdate; (Pdate) year, (Pdate) month, (Pdate) day (Pdate) SetDate(y, m, d),5.2 对象的定义,对象成员(数据成员/成员函数)的表示方法: 对象引用: () 例: TDate date1, rdate.year, rdate.month, rdate.day rdate.SetDate(y, m, d) 说明: 同一个类创建的不同对象,其数据结构相同系统为其分配相同长度的内存单元。但其内容有可能不同; 同一个类创建的不同对象,共享类中的成员函数 =系统只为所定义的对象提供数据成员的内存空间,5.2 对象的定义,例5.1:分析程序的输出结果,5.2 对象的定义,例5.1:分析程序的输出结果,/系统只为所定义的对象提供数据成员的内存空间,5.2 对象的定义,例5.1:分析程序的输出结果,/系统只为所定义的对象提供数据成员的内存空间,/对象调用类的成员函数,1996,5,4,5.2 对象的定义,例5.1:分析程序的输出结果,/系统只为所定义的对象提供数据成员的内存空间,/对象调用类的成员函数,1996,5,4,1998,4,9,5.2 对象的定义,例5.1:分析程序的输出结果,/系统只为所定义的对象提供数据成员的内存空间,/对象调用类的成员函数,1996,5,4,1998,4,9,int leap,date1.year,1,5.2 对象的定义,例5.1:分析程序的输出结果,/系统只为所定义的对象提供数据成员的内存空间,/对象调用类的成员函数,1996,5,4,1998,4,9,int leap,1,5.2 对象的定义,例5.1:分析程序的输出结果,/系统只为所定义的对象提供数据成员的内存空间,/对象调用类的成员函数,1996,5,4,1998,4,9,int leap,1,5.2 对象的定义,例5.1:分析程序的输出结果,/系统只为所定义的对象提供数据成员的内存空间,/对象调用类的成员函数,结论?,1、在程序中,可以访问类的公有成员 2、类的成员函数只能通过该类定义的对象来调用,5.2 对象的定义,例5.1:分析程序的输出结果,/系统只为所定义的对象提供数据成员的内存空间,/对象调用类的成员函数,问题?,5.2 对象的定义,例5.1:分析程序的输出结果,/系统只为所定义的对象提供数据成员的内存空间,/对象调用类的成员函数,结论?,类的私有成员不能被程序所访问,只能被类的成员函数所访问,5.2 对象的定义,例5.2:分析程序的输出结果,5.2 对象的定义,例5.2:分析程序的输出结果,数据成员,5.2 对象的定义,例5.2:分析程序的输出结果,3,5,5.2 对象的定义,例5.2:分析程序的输出结果,3,5,8,10,5.2 对象的定义,例5.2:分析程序的输出结果,3,5,8,10,5,6,5.2 对象的定义,例5.2:分析程序的输出结果,3,5,8,10,5,6,9,8,5.2 对象的定义,例5.2:分析程序的输出结果,3,5,8,10,5,6,9,8,5.2 对象的定义,例5.2:分析程序的输出结果,3,5,8,10,5,6,9,8,目录,5.1 类的定义 5.2 对象的定义 5.3 对象的初始化 5.4 成员函数的特性 5.5 静态成员 5.6 友元 5.7 类的作用域 5.8 局部类和嵌套类(自学) 5.9 对象的生存周期,5.3 对象的初始化,5.3.1 构造函数和析构函数 5.3.2 缺省构造函数和缺省析构函数 5.3.3 拷贝初始化构造函数,5.3 对象的初始化,回顾:TDate类与TPoint类初始化对象的方式,5.3 对象的初始化,回顾:TDate类与TPoint类初始化对象的方式,5.3 对象的初始化,总结: 对对象进行初始化,实际就是对对象的数据成员(属性)进行初始化操作; 类中都定义了一类函数实现对对象的初始化操作即为对象的数据成员赋初始值(例如TDate:SetDate(int y,int m,int d)函数,TPoint:SetPoint(int x,int y)函数)。,类中是否有一类函数专门实现对对象的初始化? 这类函数是否有特定的语法规则?,5.3 对象的初始化,在创建对象时对对象进行初始化操作的类的成员函数称为构造函数 在对象删除时对对象进行释放操作的类的成员函数称为析构函数,构造函数和析构函数,以日期类TDate类为例,构造该类的构造函数和析构函数,5.3 对象的初始化,构造函数的特点: 构造函数是类的成员函数,可以定义在类体内,也可以定义在类体外; 构造函数的函数名必须与类名相同; 构造函数的返回值类型不指定说明,具有隐含的函数返回值,该值由系统内部使用;,TDate类的构造函数:函数名为TDate,TDate类的构造函数:TDate函数不指明返回值类型,构造函数和析构函数,5.3 对象的初始化,构造函数的特点: 构造函数可以有一个参数,也可以有多个参数;,构造函数的作用是对类的数据成员进行初始化操作, 所以定义TDate类的构造函数如下: class TDate public: TDate(int y,int m,int d) year=y; month=m; day=d; private: int year,month,day; ;,构造函数和析构函数,5.3 对象的初始化,构造函数的特点: 构造函数可以重载,即同一个类中可以定义多个参数不同的构造函数; 程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。,void main() TDate date1(2000,3,10); ,TDate(int y,int m,int d) year=y; month=m; day=d;,/对对象进行初始化操作,系统自动调用类的构造函数,构造函数和析构函数,5.3 对象的初始化,析构函数的特点: 析构函数是类的成员函数,可以定义在类体内,也可以定义在类体外; 析构函数的函数名与类名相同,前面加字符用来与构造函数进行区别; 析构函数不指定函数的返回值类型,也没有参数; 析构函数不可以重载,即一个类中只能定义一个析构函数;,构造函数和析构函数,TDate类的析构函数:函数名为TDate,TDate类的析构函数:定义为TDate( );,5.3 对象的初始化,析构函数的特点: 析构函数可以被程序调用,也可以由系统调用自动。在下面两种情况下,析构函数会被系统自动调用: 如果一个对象被定义在函数体内,则当函数结束时,该对象的析构函数会被自动调用; 如果一个对象是用new运算符被动态创建的,则在使用delete运算符释放它时,delete将会自动调用析构函数。,构造函数和析构函数,void main() TDate date1(2000,3,10); ,系统自动调用类的析构函数,TDate( ) ,5.3 对象的初始化,重新定义日期TDate类(保存在tdate.h中),5.3 对象的初始化,例5.3:分析程序的输出结果,系统自动调用类的构造函数,ty.year=1998,ty.month=4,ty.day=9,输出: Constructor called.,输出: Constructor called.,5.3 对象的初始化,例5.3:分析程序的输出结果,系统自动调用类的构造函数,ty.year=1998,ty.month=4,ty.day=9,tm.year=1998,tm.month=4,tm.day=10,输出: Constructor called. Constructor called.,输出: Constructor called. Constructor called.,5.3 对象的初始化,例5.3:分析程序的输出结果,对象调用类的成员函数,ty.year=1998,ty.month=4,ty.day=9,tm.year=1998,tm.month=4,tm.day=10,today.year,today.month,today.day,输出: Constructor called. Constructor called. today is 1998.4.9,5.3 对象的初始化,例5.3:分析程序的输出结果,ty.year=1998,ty.month=4,ty.day=9,tm.year=1998,tm.month=4,tm.day=10,tomor.year,tomor.month,tomor.day,输出: Constructor called. Constructor called. today is 1998.4.9 tomorrow is 1998.4.10,输出: Constructor called. Constructor called. today is 1998.4.9 tomorrow is 1998.4.10,5.3 对象的初始化,例5.3:分析程序的输出结果,ty.year=1998,ty.month=4,ty.day=9,tm.year=1998,tm.month=4,tm.day=10,输出: Constructor called. Constructor called. today is 1998.4.9 tomorrow is 1998.4.10 Destructor called.,系统自动调用类的析构函数,输出: Constructor called. Constructor called. today is 1998.4.9 tomorrow is 1998.4.10,5.3 对象的初始化,例5.3:分析程序的输出结果,ty.year=1998,ty.month=4,ty.day=9,tm.year=1998,tm.month=4,tm.day=10,输出: Constructor called. Constructor called. today is 1998.4.9 tomorrow is 1998.4.10 Destructor called.,系统自动调用类的析构函数,输出: Constructor called. Constructor called. today is 1998.4.9 tomorrow is 1998.4.10 Destructor called. Destructor called.,5.3 对象的初始化,5.3.1 构造函数和析构函数 5.3.2 缺省构造函数和缺省析构函数 5.3.3 拷贝初始化构造函数,5.3 对象的初始化,缺省构造函数: 在定义类时没有定义任何构造函数,则编译器自动生成一个不带参数的缺省构造函数: :( ) 缺省析构函数: 在定义类时没有定义任何析构函数,则编译器自动生成一个不带参数的缺省析构函数: :( ) ,缺省构造函数和缺省析构函数,说明:用缺省构造函数对对象初始化时,对 象的所有数据成员都初始化为零或空,说明:缺省析构函数是空函数,5.3 对象的初始化,5.3.1 构造函数和析构函数 5.3.2 缺省构造函数和缺省析构函数 5.3.3 拷贝初始化构造函数,5.3 对象的初始化,当用一个已知的对象来初始化同类的另一个被创建的对象时,可调用拷贝初始化构造函数。 格式: :(const &),拷贝初始化构造函数,5.3 对象的初始化,当用一个已知的对象来初始化同类的另一个被创建的对象时,可调用拷贝初始化构造函数。 格式: :(const &),拷贝初始化构造函数,例,定义TDate类的拷贝初始化构造函数: TDate(const TDate ,拷贝初始化构造函数也是构造函数,它将一个已知对象的数据成员的值拷贝给创建的同类的另一个对象; 该函数只有一个参数,是对同类进行赋值的对象的引用; 每个类都需有一个拷贝初始化构造函数;如果类中没有说明,则编译系统自动生成一个缺省的拷贝初始化构造函数,作为该类的公有成员。,5.3 对象的初始化,例5.4:重新定义点类TPoint (存到tpoint1.h中),5.3 对象的初始化,例5.5:分析程序输出结果,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialization Constructor called.,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialization Constructor called.,输出: Copy_initialization Constructor called. P2=5,7,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialization Constructor called. P2=5,7,输出: Copy_initialization Constructor called. P2=5,7 Destructor called.,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialization Constructor called. P2=5,7 Destructor called.,输出: Copy_initialization Constructor called. P2=5,7 Destructor called. Destructor called.,5.3 对象的初始化,例5.5:分析程序输出结果,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called.,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called.,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called.,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. Ok,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. Ok,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok,x=30,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok,x=30,y=55,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok,x=30,y=55,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok,x=30,y=55,由于不能返回main主函数,所以将R的值暂时赋给一个匿名对象。 需要调用拷贝初始化构造函数,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok,x=30,y=55,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called.,5.3 对象的初始化,例5.5:分析程序输出结果,x=30,y=55,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called.,调用两次,分别释放对象R和对象Q,5.3 对象的初始化,例5.5:分析程序输出结果,x=30,y=55,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called.,5.3 对象的初始化,例5.5:分析程序输出结果,x=30,y=55,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called.,5.3 对象的初始化,例5.5:分析程序输出结果,x=30,y=55,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called.,调用一次,释放匿名对象A,赋值结束,需要释放匿名对象A,5.3 对象的初始化,例5.5:分析程序输出结果,x=30,y=55,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called. Destructor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called. Destructor called.,5.3 对象的初始化,例5.5:分析程序输出结果,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called. Destructor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called. Destructor called. P=30,55,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called. Destructor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called. Destructor called. P=30,55,调用三次,分别释放对象N、对象P和对象M,5.3 对象的初始化,例5.5:分析程序输出结果,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called. Destructor called.,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called. Destructor called. P=30,55,输出: Copy_initialzation Constrctor called. Copy_initialzation Constrctor called. ok Copy_initialzation Constrctor called. Destructor called. Destructor called. Destructor called. P=30,55 Destructor called. Destructor called. Destructor called.,5.3 对象的初始化,拷贝初始化构造函数,拷贝初始化构造函数的功能就是用一个已知的对象来初始化另一个对象; 调用拷贝初始化构造函数的三种情况: 明确表示由一个对象初始化另一个对象时: 例:TPoint P2(P1); 当对象作为函数参数传递给函数形参时: 例:P=f(N); 当对象作为函数返回值时: 例:return R;,目录,5.1 类的定义 5.2 对象的定义 5.3 对象的初始化 5.4 成员函数的特性 5.5 静态成员 5.6 友元 5.7 类的作用域 5.8 局部类和嵌套类(自学) 5.9 对象的生存周期,5.4 成员函数的特性,一般的成员函数都可以重载,但析构函数不可重载,重载性,例5.7:分析程序输出结果,5.4 成员函数的特性,例5.7:分析程序输出结果,5.4 成员函数的特性,例5.7:分析程序输出结果,输出: a=10,20,5.4 成员函数的特性,例5.7:分析程序输出结果,输出: a=10,20,输出: a=10,20 b=4,16,5.4 成员函数的特性,例5.7:分析程序输出结果,b.X=4,b.Y=16,i,i=30,5.4 成员函数的特性,例5.7:分析程序输出结果,b.X=4,b.Y=16,i=30,j,j=12,5.4 成员函数的特性,例5.7:分析程序输出结果,k,k=10,5.4 成员函数的特性,例5.7:分析程序输出结果,k=10,输出: a=10,20 b=4,16,输出: a=10,20 b=4,16 30 12 10,5.4 成员函数的特性,设置参数的缺省值,一般的成员函数和构造函数均可被设置参数的缺省值,回顾:参数的缺省值,给形参赋默认值(缺省值),可以是数值,也可以是任意表达式; 函数调用时,编译器按从左向右的顺序将实参与形参结合,当实参的数目不足时,编译器将用函数说明或定义时形参的默认值补足所缺少的实参; 一个指定了默认值的参数右边不能出现没有指定默认值的参数。,5.4 成员函数的特性,例5.8:分析程序输出结果,构造函数设置参数的缺省值,5.4 成员函数的特性,例5.8:分析程序输出结果,5.4 成员函数的特性,例5.8:分析程序输出结果,输出: X=3,5,7 Y=9,11,7 Z=13,15,17,目录,5.1 类的定义 5.2 对象的定义 5.3 对象的初始化 5.4 成员函数的特性 5.5 静态成员 5.6 友元 5.7 类的作用域 5.8 局部类和嵌套类(自学) 5.9 对象的生存周期,5.5 静态成员,思考,1、类的成员函数之间如何实现数据的共享? 例:M:f1(int x) sum+=x; M:f2(int y) sum+=y; 2、同一个类定义的不同对象之间如何实现数据的共享? 例:定义了学生类Tstud,现有n个学生对象s1,s2,s3sn,统计输出这n个学生的总成绩: sum=s1.re+s2.re+s2.re+sn.re,5.5 静态成员,思考:引入全局变量是否可行?,例5.9:全局变量的使用,结果?,安全?,5.5 静态成员,全局变量的使用: 使用全局变量,可以达到数据共享的目的 使用全局变量,会破坏程序的安全性:全局变量不仅对于类的成员函数可见,而且对于程序中的其他函数可见。因此,在其他函数中对全局变量的值进行更新会直接影响到该全局变量在类的成员函数中的值。,是否有方法,使得一个变量既可以被同一个类定义的不同 对象共享,又无法被除类的成员函数之外的其他函数访问?,静态成员 静态数据成员 静态成员函数,静态成员的引入,是为了解决数据共享的问题,5.5 静态成员,所谓静态变量,是指其存储方式为静态存储的变量。其内存空间在程序运行期间由系统分配固定的存储空间; 包括:静态局部变量和静态外部变量。声明/定义时使用关键字static; 静态局部变量:局部变量,值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放; 静态外部变量:全局变量,在程序一个文件中定义的外部变量,该变量值为定义它的文件使用而不能被其他文件引用。,回顾:静态变量,5.5 静态成员,静态数据成员是类的数据成员,与普通数据成员不同处在于它可以被由该类定义的所有对象所共享(实现了在不同对象之间的数据共享); 静态数据成员只存储一处,供所有对象共享=一个对象对静态数据成员值更新,则对其它对象而言,静态数据成员值也发生改变。,静态数据成员,5.5 静态成员,静态数据成员在类体内定义,属于类的数据成员: static ; 例:private: int a,b,c; static int s;,静态数据成员,5.5 静态成员,静态数据成员在类体外初始化: :=; 静态数据成员初始化时前面不加static,以免与一般静态变量或对象混淆; 静态数据成员初始化时前面不加private、public等访问权限控制符; 静态数据成员初始化时前面加类名,以表明该静态数据成员属于哪一个类; 静态数据成员是类的成员,而不是对象的成员。,静态数据成员,5.5 静态成员,静态数据成员在类体外初始化: :=; 静态数据成员是静态存储,必须进行初始化操作: 例: class Nclass private: static int a; ; int Nclass:a=5;,静态数据成员,5.5 静态成员,静态数据成员的引用: :,静态数据成员,5.5 静态成员,例5.10:静态数据成员的使用,5.5 静态成员,例5.10:静态数据成员的使用,Myclass:Sum= 0,Myclass:Sum=20,5.5 静态成员,例5.10:静态数据成员的使用,Myclass:Sum= 0,Myclass:Sum=20,Myclass:Sum=54,实现Sum变量在不同对象之间的共享,5.5 静态成员,Myclass:Sum= 0,Myclass:Sum=20,Myclass:Sum=54,输出: Number=3,7,10,例5.10:静态数据成员的使用,5.5 静态成员,Myclass:Sum= 0,Myclass:Sum=20,Myclass:Sum=54,输出: Number=3,7,10,输出: Number=3,7,10 Number=14,9,11,例5.10:静态数据成员的使用,5.5 静态成员,Myclass:Sum= 0,Myclass:Sum=20,Myclass:Sum=54,输出: Number=3,7,10,输出: Number=3,7,10 Number=14,9,11,输出: Number=3,7,10 Number=14,9,11 Sum=54,例5.10:静态数据成员的使用,5.5 静态成员,Myclass:Sum= 0,Myclass:Sum=20,Myclass:Sum=54,输出: Number=3,7,10,输出: Number=3,7,10 Number=14,9,11,输出: Number=3,7,10 Number=14,9,11 Sum=54,输出: Number=3,7,10 Number=14,9,11 Sum=54 Sum=54,例5.10:静态数据成员的使用,5.5 静态成员,静态成员函数是类的静态成员,不是某个对象的成员函数。因此,在引用静态成员函数时不需要使用对象名; 静态成员函数不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员; 如果静态成员函数需要引用类中说明的非静态成员,则只能通过对象来引用。,静态成员函数,5.5 静态成员,例5.11:静态成员函数的使用,5.5 静态成员,M:B=0,M:B=5,P.A=5,例5.11:静态成员函数的使用,5.5 静态成员,M:B=0,M:B=5,P.A=5,Q.A=10,M:B=15,例5.11:静态成员函数的使用,5.5 静态成员,M:B=0,M:B=5,P.A=5,Q.A=10,M:B=15,输出: A=5 B=15,例5.11:静态成员函数的使用,5.5 静态成员,M:B=0,M:B=5,P.A=5,Q.A=10,M:B=15,输出: A=5 B=15,输出: A=5 B=15 A=10 B=15,例5.11:静态成员函数的使用,5.5 静态成员,总结: 静态成员分为静态数据成员和静态成员函数; 静态数据成员与静态成员函数均实现了数据的共享:静态数据成员实现同一个类定义的不同对象之间/不同成员函数之间的数据共享,静态成员函数实现普通函数与成员函数之间的数据共享; 静态数据成员与静态成员函数都是类的成员。它们说明在类体内,初始化/定义在类体外;,静态数据成员,静态成员函数,5.5 静态成员,总结: 静态数据成员与静态成员函数在调用时均需在前面加上:,它们不属于任何对象,只属于类,为该类定义的所有对象共享。,静态数据成员,静态成员函数,5.5 静态成员,注释: 1、静态数据成员 不写为Myclass:Sum的原因?,不写为Myclass:Sum的原因?,函数Myclass(int,int,int)与GetSum( )是类的成员函数,不属于类的某一个对象,而是被所有对象所公有。所以在类的成员函数中引用类的静态数据成员时,可省略 “类名:”,5.5 静态成员,注释: 1、静态数据成员,如何在main( )主函数中调用静态数据成员Sum?,void main( ) Myclass m(1,2,3); coutMyclass:Sum; ,void main( ) Myclass m(1,2,3); coutm.Sum; ,void main( ) Myclass m(1,2,3); coutSum; ,5.5 静态成员,注释: 2、静态成员函数,目录,5.1 类的定义 5.2 对象的定义 5.3 对象的初始化 5.4 成员函数的特性 5.5 静态成员 5.6 友元 5.7 类的作用域 5.8 局部类和嵌套类(自学) 5.9 对象的生存周期,5.6 友元,程序中的其他函数可以访问类的公有成员; 只有类的成员函数才能访问类的私有成员,而程序中其他函数无法访问类的私有成员(类的封装性); 如何在不破坏类的封装性的前提下,使类允许程序中的某些函数访问其私有成员?,思考,友元,友元函数和友元类,5.6 友元,能够访问类中私有成员的非类的成员函数的函数,称为该类的友元函数 友元函数在类体内声明,使用关键字friend; 友元函数在类体外定义,定义时与普通函数没有语法上的区别; 友元函数提高了程序运行的效率,但破坏了类的封装性。,友元函数,5.6 友元,例5.12:友元函数的应用求两点之间的距离,5.6 友元,例5.12:友元函数的应用求两点之间的距离,5.6 友元,输出: (3,4),例5.12:友元函数的应用求两点之间的距离,5.6 友元,输出: (3,4),输出: (3,4) (6,8),例5.12:友元函数的应用求两点之间的距离,5.6 友元,d,输出: (3,4) (6,8),例5.12:友元函数的应用求两点之间的距离,5.6 友元,d,输出: (3,4) (6,8),dx,dx=-3.0,实现非类的成员函数访问类的私有成员的目的,例5.12:友元函数的应用求两点之间的距离,5.6 友元,d,输出: (3,4) (6,8),dx,dx=-3.0,dy,dy=-4.0,例5.12:友元函数的应用求两点之间的距离,5.6 友元,d,输出: (3,4) (6,8),dx,dx=-3.0,dy,dy=-4.0,x=5,例5.12:友元函数的应用求两点之间的距离,5.6 友元,d,输出: (3,4) (6,8),dx,dx=-3.0,dy,dy=-4.0,x=5,例5.12:友元函数的应用求两点之间的距离,5.6 友元,d,输出: (3,4) (6,8),dx,dx=-3.0,dy,dy=-4.0,x=5,d=5,例5.12:友元函数的应用求两点之间的距离,5.6 友元,d,输出: (3,4) (6,8),dx,dx=-3.0,dy,dy=-4.0,x=5,d=5,输出: (3,4) (6,8) Distance is5,例5.12:友元函数的应用求两点之间的距离,5.6 友元,友元函数的调用:与普通函数一样,注意,类的成员函数的调用:只有类的对象才能调用类的成员函数,例5.13 自学,5.6 友元,总结: 友元函数声明在类体内(关键字friend),定义在类体外; 友元函数本质是普通的函数,因此在定义及调用时与普通的函数一样; 友元函数与普通的函数区别在于
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 辽宁工业大学《马克思主义哲学经典著作》2023-2024学年第二学期期末试卷
- 云南省禄丰县广通中学2024-2025学年高三4月质量调研(二模)考试化学试题含解析
- 河北省邯郸市成安县2024-2025学年六年级下学期小升初招生数学试卷含解析
- 新疆大学《影视非线性编辑与合成》2023-2024学年第一学期期末试卷
- 湖南省雅礼洋湖中学2024-2025学年高三4月期中练习(二模)物理试题(理、文合卷)试题含解析
- 辽宁省重点高中协作校2024-2025学年全国高考招生统一考试考前诊断(一)英语试题含解析
- 江苏省南京六合区程桥高中2024-2025学年高三年级模拟考试(四)英语试题含解析
- 山东省商河县龙桑寺镇2024-2025学年中考终极猜想:英语试题最后一卷名师猜题含答案
- 泰山护理职业学院《三维建模技术》2023-2024学年第二学期期末试卷
- 西南交通大学《人工智能医疗器械法规与注册》2023-2024学年第一学期期末试卷
- 2025年江苏金陵科技集团有限公司招聘笔试参考题库含答案解析
- GB/T 30595-2024建筑保温用挤塑聚苯板(XPS)系统材料
- 送达地址确认书(法院最新版)
- 《一幅不可思议的画》课件
- 各种玻璃配方知识
- 四肢骨折的固定搬运课件
- 全国主体功能区规划图
- F5负载均衡运维配置手册V10
- 管道支架重量计算表(计算支架)
- 充电桩安装施工流程
- 成绩单表格样表
评论
0/150
提交评论