类-重庆工商大学

上传人:tian****1990 文档编号:72163004 上传时间:2019-01-22 格式:PPT 页数:51 大小:322KB
返回 下载 相关 举报
类-重庆工商大学_第1页
第1页 / 共51页
类-重庆工商大学_第2页
第2页 / 共51页
类-重庆工商大学_第3页
第3页 / 共51页
类-重庆工商大学_第4页
第4页 / 共51页
类-重庆工商大学_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《类-重庆工商大学》由会员分享,可在线阅读,更多相关《类-重庆工商大学(51页珍藏版)》请在金锄头文库上搜索。

1、第三讲 类,类的引入 类的具体语法形式 构造函数和析构函数 this指针、静态成员和常量成员 友元和嵌套类 对象数组和指针间的关系,2019年1月22日,2,C是C的子集,C具备了封装、继承和多态性等主要面向对象特征。 当退化为C时,处理要求高效率的地方和C完全相同;强调面向对象特性时,一般比C慢百分之十几。,C更好的C: C简洁的单行注释; 严格的参数检查; 用引用传递参数; 灵活的局部变量说明(C是在任何执行语句前); 内联函数(凡是有循环语句或switch语句的函数不能成为内联函数); 常量修饰,包括几种常量指针; 空间申请和释放;,数据的抽象和封装: 传统的程序设计语言强调“功能”(函

2、数、操作),数据的功能不如功能大,只提供几种内部数据类型; C提升了数据的重要性,建立新的数据类型和表示出这些数据类型的对象之间的交互性是重要的。,2019年1月22日,3,1 类的引入 类是结构的扩展,可用来对外部函数访问的限制。,stack.h void push(char); char pop(); stack.cpp #include“stack.h“ static char v100; static char *p=v; void push(char c) / char pop() / ,局部变量隐藏在函数体内;通过函数的参数传递共享变量。,使用静态全局变量,局限于文件。,使用全局变

3、量,程序中每个函数都可以访问。,2019年1月22日,4,other.cpp include include “stack.h“ void some_function() push(c); char c=pop( ); ,外部函数通过公共接口访问数据,而不必关心数据的存储形式。但 存放的是具体的数据,而不是数据的描述。,结构是对数据描述,可创建多个对象。,2019年1月22日,5,堆栈的结构版本: struct stack char v100; char *p; void push(char c) / char pop() / ;,C+引入类解决上述问题(限制全局变量使用和构成新类型),堆栈的

4、使用: stack sta1, sta2; sta1.p=sta1.v; sta2.p=sta2.v; sta1.push(c);,外部函数可直接访问结构的成员。,2019年1月22日,6,2 类定义 与结构不同之处是成员访问说明符。,类的实例也就是所谓的对象: stack sta1; stack *pstack=new stack;,堆栈的类版本: class stack private: char v100; char *p; public: void push(char c) / char pop() / ;,2019年1月22日,7,可用一特殊成员函数(构造函数)初始化,每当创建对象时

5、系统自动调用此函数。 名字与类相同,无返回值,公有成员函数,类的使用: void main( ) stack sta; sta.p=sta.v; /() sta.push(a); char ch=sta.pop(); ,3 构造函数和析构函数 class CTest int n=0; int rint=n; /. ,一个类的普通数据成员,在不同的对象中占用不同的空间;但成员函数不管在哪个实例中调用,都占用同一空间。,2019年1月22日,8,class stack private: char v100; char *p; public: stack( ) p=v; void push(char

6、 c); void pop(); ;,类的使用: void main( ) / stack sta; sta.push(a); char ch=sta.pop(); ,2019年1月22日,9,构造函数可带参数 class stack private: char *v; char *p; int size; public: stack( ) p=v; stack( int sz ) v=new charsize=sz ; p=v; / ;,例如: stack( ) delete v; ,构造函数可以重载。例如:既有缺省构造函数,同时又有一个带参构造函数。构造函数可有多个,这时要注意二义性。,2

7、019年1月22日,10, 拷贝构造函数 拷贝构造函数首先是构造函数,创建对象时被调用,其功能是将一个已存在的对象的数据成员拷贝给正在创建的的另一个同类对象。拷贝构造函数具有以下特点: 具有构造函数的所有特性。 该函数只有一个参数,并且是对对象的引用。 对每个类,编译系统会自动生成一个拷贝构造函数,作为该类的公有成员。但用户可以自定义一个,其定义格式为: :(const & ) 其中,参数是一个被const修饰的引用,从而说明在函数体中对该引用所引用的对象是不能修改的。,2019年1月22日,11,例1 使用缺省拷贝构造函数。 #include “iostream.h“ class point

8、 int x,y; public: void setpoint(int a,int b) x=a;y=b; int getx() return x; int gety() return y; point(int a,int b) x=a;y=b; ; void main() point p1(12,12),p2(p1); cout p2.getx() “ “ p2.gety() endl; 程序执行后的显示结果为: 12 12,2019年1月22日,12,例2 使用自定义拷贝构造函数。 #include “iostream.h“ class point int x,y; public: voi

9、d setpoint(int a,int b) x=a;y=b; int getx() return x; int gety() return y; point(int a,int b) x=a;y=b; point(point ,2019年1月22日,13,point:point(point 程序执行后的显示结果为: Copy-initialization contructor called! 12 12,2019年1月22日,14,例3 使用拷贝构造函数。 #include “iostream.h“ class point ; point f(point q); /原型声明 class p

10、oint int x,y; public: void setpoint(int a,int b) x=a;y=b; int getx() return x; /通过成员函数访问私有成员 int gety() return y; /通过成员函数访问私有成员 point() x=0;y=0; ; point(int a,int b) x=a; y=b; /定义构造函数 point(const point ,2019年1月22日,15,point:point(const point ,2019年1月22日,16,point r(x,y); return r; /函数返回临时对象时调用拷贝构造函数 程

11、序执行后的显示结果为: copy-Initializtion completed! 12 12 - copy-Initializtion completed! copy-Initializtion completed! 22 22,2019年1月22日,17,在上面的程序中,拷贝构造函数被调用了3次。第一次是在main()函数中执行point p2(p1); 时;第二次是在调用函数f()时,实参p2给形参对象q进行初始化时,即实参向形参传递值时;第三次是在执行函数f()中的返回语句return r;时,系统用返回值初始化一匿名的point对象时使用了拷贝构造函数。 在调用f()函数返回主函数m

12、ain()后,用赋值运算符将匿名对象的值赋给对象p3,然后释放匿名对象。,2019年1月22日,18,通过上面的例题分析,在下面三种情况系统自动调用拷贝构造函数来初始化一个对象: 明确表示由一个对象初始化一个对象。 例如,上例main()中: point p1(12,12),p2(p1), p3; 当对象作为函数实参传递给函数形参时。 例如,上例main()中: p3=f(p2); 当对象作为函数的返回值时。 例如,上例main()中: return r;,2019年1月22日,19,析构函数 析构函数是特殊的成员函数,它具有以下特点: 析构函数是成员函数,它可写在类体内,也可写在类体外。 析

13、构函数的名字为:。析构函数不指定返回值类型,也没有参数。 不能重载。一个类中只可定义一个析构函数。 析构可被调用,系统也可自动调用。在下面两种情况下,析构函数自动被调用: 局部非静态对象离开其作用域时。 当一个对象用new运算符创建的,在使用delete运算符释放它时。,2019年1月22日,20,例 使用析构造函数。 #include “iostream.h“ class point ; class point f(point q); class point int x,y; public: void setpoint(int a,int b) x=a;y=b; int getx() ret

14、urn x; /通过成员函数访问私有成员 int gety() return y; /通过成员函数访问私有成员 point() x=0;y=0; ; /定义构造函数 point(int a,int b) x=a;y=b; /定义缺省构造函数 point(const point /声明明拷贝构造函数,2019年1月22日,21,point() /定义析构函数 cout “Destructor called!n“ ; ; point:point(const point ,2019年1月22日,22,point f(point q) /拷贝实参对象以创建形参对象q int x,y; x=q.getx

15、() + 10; y=q.gety()+10; point r(x,y); /创建对象r return r; /拷贝r以创建函数返回的临时对象 程序执行后的显示结果为: copy-Initializtion completed! 12 12 - copy-Initializtion completed! copy-Initializtion completed! Destructor called! Destructor called!,2019年1月22日,23,Destructor called! 22 22 Destructor called! Destructor called! Destructor called! 在上例中,退出函数f()时,函数中定义的两个对象q、r被释放,系统自动调用析构函数2次。在main()函数中,用赋值运算符将匿名对象赋给对象p3后,系统释放匿名对象,此时又调用一次析构函数,共调用了3次析构函数。 最后,退出整个程序时,系统释放p1、p2和p3三个对象,又3次调用析构函数。,2019年1月22日,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号