c程序设计(part2).ppt
《c程序设计(part2).ppt》由会员分享,可在线阅读,更多相关《c程序设计(part2).ppt(78页珍藏版)》请在三一办公上搜索。
1、C+程序设计(part 2),OOP,Whatnon-OO Solution,#include#define STACK_SIZE 100struct Stack int top;int bufferSTACK_SIZE;void main()Stack st1,st2;st1.top=-1;st2.top=-1;int x;push(st1,12);pop(st1,x);,bool push(Stack,bool pop(Stack,st1.buffer2=-1;st2.buffer2+;,_,OOP,OO Solution,#include#define STACK_SIZE 100cla
2、ss Stack private:int top;int bufferSTACK_SIZE;public:Stack()top=-1;bool push(int i);bool pop(int,bool Stack:push(int i);if(top=STACK_SIZE-1)cout“Stack is overflow.n”;return false;else top+;buffer top=i;return true;,bool Stack:pop(int,#include#define STACK_SIZE 100struct Stack int top;int bufferSTACK
3、_SIZE;void main()Stack st1,st2;st1.top=-1;st2.top=-1;int x;push(,X,bool push(Stack*const this,int i),bool pop(Stack*const this,int&i),this-,this-,this-,this-,this-,this-,this-,this-,st1.buffer2=-1;,Encapsulation,Information Hidding,OOP,ConceptsProgramObject1+Object2+ObjectnObject:Data+OperationMessa
4、ge:function callClassObject-OrientedObject-BasedOnly Provide EncapsulationWithout InheritanceAda,etc,OOP,Why评价标准Efficency of DevelopmentQualityExternal Correctness、Efficiency、Robustness、Reliability Usability、ReusabilityInternal Readability、Maintainability、Portability,HUIUX,产品在规定的条件下和规定的时间内完成规定功能的能力(
5、概率度量:可靠度),需求架构设计构建模式代码测试用例项目组织结构,OOP,Advantages 提高开发效率和软件质量更高层次的抽象数据抽象数据封装更好的模块化支持(高内聚、低耦合)软件复用(部分重用)对需求变更具有更好的适应性,C+vs Java,类,类定义 class;组成成员:成员变量、成员函数成员变量:在类定义中给出的是声明成员函数:在类定义中给出的是定义或声明类成员的访问控制描述,类,class TDate public:void SetDate(int y,int m,int d);int IsLeapYear();void Print();private:int year,mon
6、th,day;,类定义不完整,类,成员变量声明 在类定义中对成员变量的说明是声明不能赋值 在类定义中声明成员变量时不能初始化引用或指针类型成员变量,类,class A;class B A a;/Error B b;/Error A*p;/OK B*q;/OK A/OK,类型还未定义/未定义完全 只能声明成指针或引用,类,成员函数在类定义中定义成员函数(inline)class TDate public:void SetDate(int y,int m,int d)year=y;month=m;day=d;int IsLeapYear()return(year%4=0,类,在类定义外定义成员函数
7、,class TDate public:void SetDate(int y,int m,int d);void Print();private:int year,month,day;,void TDate:SetDate(int y,int m,int d)year=y;month=m;day=d;void TDate:Print()coutyear.month.dayendl;,a.h,a.cpp,类,成员函数的重载 遵循一般函数的重载规则class A public:void f();int f(int i);double f(double d);void main()A a;a.f()
8、;a.f(1);a.f(1.0);,类,对象属性和行为的封装体类的实例,属于值的范畴 类属于类型范畴,用于描述对象的属性,构造函数,对象的初始化描述与类同名、无返回类型自动调用,不可直接调用可重载默认构造函数:无参数的构造函数系统提供的默认构造函数当类中未提供构造函数时,编译系统自动提供参与对象的构造过程通常定义为 public有时也声明为私有的,其作用是限制创建该类对象的范围,即只能在本类和友元中创建该类对象,构造函数,构造函数的调用创建对象时,构造函数将自动被调用,所调用的构造函数在创建对象时指定 class A public:A();A(int i);A(char*p);A a1=A(1
9、);A a1(1);A a1=1;/调A(int i)A a2=A();A a2;/调A(),注意:不能写成:A a2();A a3=A(“abcd”);A a3(“abcd”);A a3=“abcd”;/调A(char*)A a4;/调用a0、a1、a2、a3的A()A b5=A(),A(1),A(abcd),2,xyz“;,成员初始化表,成员初始化表定义构造函数时,函数头和函数体之间可以加入一个对数据成员进行初始化的表,用于对数据成员进行初始化 class A int x;const int y;int public:A():y(1),z(x),x(0);,成员初始化表,class A i
10、nt m;public:A()m=0;A(int m1)m=m1;,class B int x;A a;public:B()x=0;B(int x1)x=x1;B(int x1,int m1):a(m1)x=x1;,void main()B b1;/调用B:B()和A:A()B b2(1);/调用B:B(int)和A:A()B b3(1,2);/调用B:B(int,int)和A:A(int),成员初始化表,在构造函数中尽量使用成员初始化表取代赋值动作const 成员/reference 成员/对象成员效率高数据成员太多时,不采用本条准则降低可维护性,成员初始化表,成员初始化表中的声明次序成员初
11、始化的次序取决于它们在类定义中的声明次序,与它们在成员初始化表中的次序无关减轻编译系统的负担注意类成员定义的次序,class CString char*p;int size;public:CString(int x):size(x),p(new charsize);,?,析构函数,析构函数()对象消亡时,系统自动调用,class String char*str;public:String()str=NULL;String(char*p)str=new charstrlen(p)+1;strcpy(str,p);String()delete str;int length()return strl
12、en(str);char get_char(int i)return stri;,Java:finalize(),RAII vs GCResource Acquisition Is Initialization,析构函数,void set_char(int i,char value)stri=value;char,拷贝构造函数,Copy Constructor创建一个对象时,用另一个同类的对象对其初始化自动调用 class A int x,y;char*p;public:A();A(const A/拷贝构造函数,const可有可无,拷贝构造函数和,三种情况将调拷贝构造函数case1A a;A
13、b=a;case2f(A a);.A b;f(b);,拷贝构造函数,case3 A f()A a;return a;.f();如果类定义中没有给出拷贝构造函数,则编译系统提供一个默认拷贝构造函数默认拷贝构造函数的行为逐个成员初始化(member-wise initialization)如果相应的类有对象成员,则该定义是递归的,拷贝构造函数,class string char*p;public:string(char*str)p=new charstrlen(str)+1;strcpy(p,str);string()delete p;string s1(“abcd”);string s2=s1;
14、,abcd,p,p,s1,s2,string:string(const string deep copy,悬挂指针,何时需要copy constructor?,abcd,动态对象,动态对象在堆(Heap)中创建的对象称为动态对象new/delete单个动态对象的创建与撤消 class A public:A();A(int);,为什么要引入new、delete操作符?,constructor/destructor,动态对象,A*p,*q;p=new A;在程序的堆中申请一块大小为sizeof(A)的空间调用A的默认构造函数对该空间上的对象初始化返回创建的对象的地址并赋值给pq=new A(1);
15、调用A的另一个构造函数 A:A(int)delete p;调用p所指向的对象的析构函数释放对象空间 delete q;,动态对象,p=(A*)malloc(sizeof(A)free(p)malloc 不调用构造函数 free 不调析构函数new 操作符自动分配足够的空间自动返回指定类型的指针可以重载,动态对象数组,动态对象数组的创建与撤消A*p;p=new A100;delete p;注意不能显式初始化,相应的类必须有默认构造函数delete中的不能省,Const 成员,const 成员const 成员变量在成员变量的声明中加上const,则表示是常量class A const int x;
16、初始化放在构造函数的成员初始化表中进行class A const int x;public:A(int c):x(c),Const 成员,const 成员函数class A int x,y;public:void f();const A a;a.f()合法?a是常量,在程序中不应改变a的值(改变a的成员变量的值)如果A:f中没有改变a的成员变量的值,则是合法的,否则是不合法的,Const 成员,编译程序往往无法知道函数f中是否改变了a的成员变量的值为了安全,编译程序认为a.f()不合法a.f()合法在A:f中不能改变a的成员变量的值在f的定义和声明处显式地指出之class A void f()
17、const;,Const 成员,const 成员函数不能修改成员变量的值成员函数加上const 修饰符的作用调用点:告诉编译器该成员函数不会改变对象成员变量的值 定义点:告诉编译器该成员函数不应该改变对象成员变量的值,静态成员,静态成员类刻划了一组具有相同属性的对象对象是类的实例类中声明的成员变量属于实例化后的对象,有多个拷贝问题:同一个类的不同对象如何共享变量?如果把这些共享变量定义为全局变量,则缺乏数据保护,,静态成员,静态成员变量class A int x,y;static int shared;.;int A:shared=0;A a,b;类定义中声明的静态变量被该类的对象所共享类的静
18、态成员变量只有一个拷贝静态变量也遵循类的访问控制,静态成员,静态成员函数class A static int shared;int x;public:static void f()shared void q()xshared;静态成员函数只能存取静态成员变量和调用静态成员函数静态成员函数也遵循类的访问控制,静态成员,静态成员的使用通过对象使用A a;a.f();通过类使用A:f();C+对类也是对象的观点的支持在一些面向对象程序设计语言(如:Smalltalk)中,把类也看成是对象,其属性由元类(meta class)来描述类定义中的静态成员就是属于类这个对象,静态成员,class A sta
19、tic int obj_count;public:A()obj_count+;A()obj_count-;static int get_num_of_obj()return obj_count;int A:obj_count=0;类A是对象obj_count:程序运行的某时刻存在的A类对象的数目get_num_of_obj:获取A类对象的数目的方法,示例,class singletonprotected:singleton()singleton(const singleton,singleton,Resource Control原则:谁创建,谁归还解决方法:自动归还,友元,友元类外部不能访问该
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 part2
链接地址:https://www.31ppt.com/p-6503573.html