《C++_02ppt [兼容模式].pdf》由会员分享,可在线阅读,更多相关《C++_02ppt [兼容模式].pdf(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、RE.ER嵌入式学院http:/www.re-C+2RE.ER嵌入式学院http:/www.re-面向对象面向对象RE.ER嵌入式学院-http:/www.re-nC/C+的结构可以把相关联的数据元素组成一个单独的统一体。如构建一个“容器”可以有如下的类型声明:struct CStashunsigned char*storage;/存储地址size_t size;/每个元素大小unsigned int quantity;/可存储元素个数unsigned int next;/下一个位置unsigned int increment;/每次延伸个数;RE.ER嵌入式学院-http:/www.re-C
2、风格实现容器操作void init(CStash*s,size_t sz=1,unsigned int inc=10);/初始化void clean(CStash*s);/清除int add(CStash*s,const void*data);/添加void*fetch(CStash*s,unsigned int index);/取元素int count(CStash*s);/计数void increase(CStash*s,unsigned int inc);/延伸容器RE.ER嵌入式学院-http:/www.re-void init(CStash*s,size_t sz,unsigned
3、int inc)s-storage=0;s-quantity=0;s-next=0;s-size=szs-increment=inc;void clean(CStash*s)if(s-next!=NULL)delete s-storage;RE.ER嵌入式学院-http:/www.re-int add(CStash*s,const void*element)if(s-next=s-quantity)increase(s,s-increment);unsigned int startBytes=s-next*s-size;unsigned char*e=(unsigned char*)eleme
4、nt;for(int i=0;isize;i+)s-storagestart_bytes+i=ei;s-next+;return(s-next-1);RE.ER嵌入式学院-http:/www.re-void*fetch(CStash*s,unsigned int index)if(index=s-next)return NULL;return s-storage+index*s-size;int count(CStash*s)return s-next;RE.ER嵌入式学院-http:/www.re-void increase(CStash*s,unsigned int inc)int new
5、Quantity=s-quantity+inc;size_t newBytes=newQuantity*s-size;size_t oldBytes=s-quantity*s-size;unsigned char*b=new unsigned char newBytes;for(int i=0;istoragei;delete(s-storage);s-storage=b;s-quantity=newQuantity;RE.ER嵌入式学院-http:/www.re-int main(void)CStash intStash;init(&cst,sizeof(int);for(int i=0;i
6、10;i+)add(&intStash,&i);for(int i=0;icount(&intStash);i+)cout *(int*)fetch(&intStash,i)XXX;RE.ER嵌入式学院-http:/www.re-RE.ER嵌入式学院-http:/www.re-int Stash:add(const void*element)if(next=quantity)increase(increment);unsigned int startBytes=next*size;unsigned char*e=(unsigned char*)element;for(int i=0;isize
7、;i+)storagestart_bytes+i=ei;next+;return next-1;RE.ER嵌入式学院-http:/www.re-void*Stash:fetch(unsigned int index)if(index=next)return NULL;return storage+index*size;int Stash:count()return next;RE.ER嵌入式学院-http:/www.re-void Stash:increase(unsigned int inc)int newQuantity=quantity+inc;size_t newBytes=newQu
8、antity*size;size_t oldBytes=quantity*size;unsigned char*b=new unsigned char newBytes;for(int i=0;ioldBytes;i+)bi=storagei;delete(storage);storage=b;quantity=newQuantity;RE.ER嵌入式学院-http:/www.re-int main(void)Stash intStash;intStash.init(sizeof(int);for(int i=0;i10;i+)intStash.add(&i);for(int i=0;iint
9、Stash.count();i+)cout *(int*)intStash.fetch(i)endl;intStash.cleanup();return 0;RE.ER嵌入式学院http:/www.re-从结构到类n类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。n我们使用关键字class来声明一个类,方法与声明结构完全一样。RE.ER嵌入式学院-http:/www.re-RE.ER嵌入式学院-http:/www.re-n一般来讲,在C+中,结构和类可以说是完全一样的,这是在当初设计C+时就定下了的。n结构体的成员缺省时是公有的,而类成员缺省是私有的,出此
10、之外没有区别。此外,模板中只能使用类,因此我们在C+中更多的使用类而不是结构。RE.ER嵌入式学院-http:/www.re-int main(void)Stash intStash;intStash.init(sizeof(int);intStash.size=1;/引起错误for(int i=0;i10;i+)intStash.add(&i);for(int i=0;iintStash.count();i+)cout *(int*)intStash.fetch(i)endl;intStash.cleanup();return 0;RE.ER嵌入式学院-http:/www.re-n我们的“容
11、器”中的每一个数据成员都与容器的操作密切相关,如果外部函数对其进行了修改,那么整个“容器”的操作就会受到影响甚至完全崩溃。因此我们不希望这些数据能够被外部访问,这时我们可以把它设置为私有的。struct Stashunsigned char*storage;/存储地址size_t size;/每个元素大小unsigned int quantity;/可存储元素个数unsigned int next;/下一个位置unsigned int increment;/每次延伸个数;RE.ER嵌入式学院-http:/www.re-n关于访问权限,C+有如下关键字:npublic:在任何地方都能被访问。np
12、rotected:在外部不能被访问,在子类中能被访问。nprivate:只能在自己类中的成员函数调用。RE.ER嵌入式学院-http:/www.re-n修改“容器”如下,那么所有的数据都只能通过公开的函数来修改,这样保证了安全性。class Stashpublic:void init(size_t sz=1,unsigned int inc=10);/初始化void clean();/清除int add(const void*data);/添加void*fetch(unsigned int index);/取元素int count();/计数protected:/或者是 private:voi
13、d increase(unsigned int inc);/延伸容器unsigned char*storage;/存储地址size_t size;/每个元素大小unsigned int quantity;/可存储元素个数unsigned int next;/下一个位置unsigned int increment;/每次延伸个数;RE.ER嵌入式学院-http:/www.re-n一般来讲,在程序中要使用某个类只需要了解它的公共接口,即public的部份。RE.ER嵌入式学院-http:/www.re-n一个类的所有成员都位于这个类的作用域内,一个类的任何成员都能访问该类的任一其它成员。C+认为一
14、个类的全部成员都是一个整体的相关部分。n即一个类的成员函数对该类的数据成员具有无限制访问权,但仍然不能访问成员类的私有成员。RE.ER嵌入式学院-http:/www.re-class xpublic:void fun(void);Protected:int n;void X:fun(void)int n;n=3;/X:n被屏蔽RE.ER嵌入式学院-http:/www.re-int n;class xpublic:void fun(void);Protected:int n;void X:fun(void)n=3;/:n被屏蔽RE.ER嵌入式学院http:/www.re-构造与析构RE.ER嵌入
15、式学院-http:/www.re-class Stash;int main(void)Stash intStash;intStash.init(sizeof(int);for(int i=0;i10;i+)intStash.add(&i);for(int i=0;iintStash.count();i+)cout *(int*)intStash.fetch(i)endl;intStash.cleanup();return 0;n变量的初始化RE.ER嵌入式学院-http:/www.re-n类和对象。nC+建立和初始化对象的过程专门由该类的构造函数完成。这个构造函数很特殊,只要对象建立,它马上被
16、调用,给对象分配空间和初始化。n另外对象撤销时,析构函数马上被调用,作善后处理。RE.ER嵌入式学院-http:/www.re-n构造函数与类同名,它没有返回值。n析构函数的名字是类名前加上波浪线(),它不返回任何值也没有参数RE.ER嵌入式学院-http:/www.re-RE.ER嵌入式学院-http:/www.re-class Stashpublic:Stash(size_t sz=1,unsigned int inc=10);/初始化Stash();/清除int add(const void*data);/添加void*fetch(unsigned int index);/取元素int
17、count();/计数void increase(unsigned int inc);/延伸容器protected:/或者是 private:unsigned char*storage;/存储地址size_t size;/每个元素大小unsigned int quantity;/可存储元素个数unsigned int next;/下一个位置unsigned int increment;/每次延伸个数;RE.ER嵌入式学院-http:/www.re-Stash:Stash(size_t sz,unsigned int inc)storage=0;quantity=0;next=0;size=sz
18、increment=inc;Stash:Stash()if(storage!=NULL)delete storage;RE.ER嵌入式学院-http:/www.re-int main(void)Stash charStash;/调用Stash:Stashfor(char i=0;i10;i+)charStash.add(&i);for(char i=0;iintStash.count();i+)cout *(char*)charStash.fetch(i)endl;return 0;/调用Stash:Stashclass xvoid x().;void y:y().以上都是错误的,因为给构造或
19、析构函数加上了返回值RE.ER嵌入式学院-http:/www.re-n析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载。只是在类对象生命周期结束时,由系统自动调用。n它总是以构造函数相反的顺序被调用。RE.ER嵌入式学院-http:/www.re-class XX()cout“X”endl;X()cout“X”endl;.;int main()X a5;return 0;RE.ER嵌入式学院-http:/www.re-RE.ER嵌入式学院-http:/www.re-n构造函数可以有参数,并且可以被重载class X public:X(int x)n=x;prot
20、ected:int n;int main()X x(100);return 0;nC+规定,每个类必须有一个构造函数,没有构造函数就不能创建任何对象。n若未提供一个类的构造函数,则C+提供一个默认的构造函数,该默认构造函数是个无参构造函数,它仅负责创建对象而不做任何初始化工作n只要一个类定义了一个构造函数,C+就不再提供默认构造函数,也就是说,如果为类定义了一个带参的构造函数,还想要无参构造函数,则必须自己定义。n与变量定义类似,在用默认构造函数创建对象时,对象的数据成员的值符合C+变量的规定。RE.ER嵌入式学院-http:/www.re-RE.ER嵌入式学院-http:/www.re-n如
21、果没有自定义的话,系统会建立默认构造和析构函数。class Xclass Xpublic:public:void fun();X()X()void fun();n如果自定义了构造函数,那么系统默认的构造函数将失效class X public:X(int x)n=x;protected:int n;int main()X x;/error,无匹配的构造函数return 0;RE.ER嵌入式学院-http:/www.re-n如果一个类对象是另一个类对象的成员,则在那个类的对象创建所调用的构造函数中,对该成员自动调用构造函数。n成员对象的构造由其自身的构造函数完成。RE.ER嵌入式学院-http:/
22、www.re-class a;class b;class c;class m.a x;b y;c z;int main(void)m n;return 0;RE.ER嵌入式学院-http:/www.re-RE.ER嵌入式学院-http:/www.re-n成员类的构造顺序由它在类中的申明位置决定,从上至下依次构造,最后是调用宿主类的构造函数。RE.ER嵌入式学院-http:/www.re-n构造函数可以给成员类传递参数,如下:class apublic:a()m=100a(int n)m=nint m;class bpublic:b(int n):x(n)/表示将n作为x的参数b():x()/表
23、示调用x的默认构造函数a x;n也可以通过这种方式给成员变量赋值class xpublic:x():a(3),b(10)/等价于x()a=3;b=10;protected:int a,b;RE.ER嵌入式学院-http:/www.re-RE.ER嵌入式学院-http:/www.re-n给常量或者引用成员赋值class xpublic:x(int&i)m=10;n=i;protected:const int m;int&n;RE.ER嵌入式学院-http:/www.re-n冒号语法使得常量数据成员和引用成员的初始化成为可能:class xpublic:x(int&i):m(10),n(i)protected:const int m;int&n;int main(void)int i;x xx(i);RE.ER嵌入式学院-http:/www.re-n构造函数的顺序n1、局部对象,以申明的顺序构造。n2、静态对象只被构造一次。n3、所有全局对象都在main函数之前被构造,并且无特殊顺序。n4、成员以其在类中声明的顺序构造n5、析构函数以构造函数相反的顺序调用。RE.ER嵌入式学院-http:/www.re-nQ/A
限制150内