C++题目总结.doc_第1页
C++题目总结.doc_第2页
C++题目总结.doc_第3页
C++题目总结.doc_第4页
C++题目总结.doc_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

作业一:某商店经销一种货物。货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,因此,商店需要记录下目录库存的总重量。现在用C+模拟商店货物购进和卖出的情况,设计一个可以统计货物总重量的程序。要求定义一个Goods类,完成此功能。作业二:定义一个形状类,它派生圆和矩形2个子类;矩形是圆的外接矩形,使用虚函数,求圆和圆外接矩形面积之和。作业三:定义一个货物Goods类,它派生3种不同的电器子类:冰箱、彩电、空调。然后各创建一个实际的对象,即顾客购买了3种电器,比如:海尔冰箱、长虹彩电、格力空调。使用虚函数,求这些电器价格之和。/*/ C+ 复习 小贴士(33条) / 作者:彭刚/ 整理时间:2004年5月16日/ 注:这个小贴士(33条)是关于C+的一个简单梳理,/ 遗漏之处,请参见有关参考书./*1. 使用函数setw()来控制两个数据间的间隔,程序开头要包含头文件iomanip.h;2. 引用是指给存储单元取一个别名,两者为同一存储单元。3. C语言利用库函数malloc 和 free 实现动态内存分配。C+语言利用运算符new 和delete实现。4. 数据区存放程序的全局数据和静态数据 堆区存放程序动态申请的数据 栈区存放程序的局部数据和参数5. 递归算法不节省内存,运行效率也不高。但有些问题用该算法表达易于编程和理解。 程序设计优先考虑可读性,而不是高效。6. 在同一文件里,当全局变量与局部变量同名,在局部变量作用范围内,全局变量不能被访问。 即“强龙压不过地头蛇”7. 局部静态变量,作用域而言是局部,但生存期而与全局变量相同,编译时分配单元并初始,程 序执行不初始化。 把局部变量改变为静态局部变量后,改变了它的存储方式,即改变了它的生存期, 生存期为整个源程序。但作用域仍仅限于定义它的函数内,其它函数是不能使用它的。 时空变化:生存时间变长,作用空间保持不变。 把全局变量改变为静态全局变量后,改变了它的作用域,限制了它的使用范围, 其作用域为定义它的源文件内,其它源文件中的函数是不能使用它的;但生存期仍为整个源程序。 时空变化:生存时间保持不变,作用空间变小。8. 参数传值是参数值的拷贝,而不是参数本身。 函数要改变调用它的函数的变量有两种方法:指针调用和引用调用。9. 在C+中常用const变量和内联函数来代替宏和带参宏 带参数的宏定义和函数的实现的区别: 宏定义为替代和展开,没有增加系统的调用开销,仅能实现较简单的功能。 函数:增加了系统的空间和时间的调用开销。 内联函数接合了两者的优点。 使用内联函数增加了目标程序的代码量,增加了空间开销,但比使用函数节约了时间开销。 因此,内联函数是以增加目标代码的尺寸来节省时间。“以空间换时间”。10. C+把类中定义的成员函数默认为内联函数11. 函数所引用的变量在函数调用返回后必须是存在,因此,不能返回局部变量或形参。12. 类是数据隐藏和封装的单位,它将细节封装起来,只允许通过公有段的数据和函数被访问, 类避免来自外界有意或无意的破坏性访问。 例外:友元函数可以访问类的私有函数。友员提供一个不同类的共享机制。 友员是 C+ 提供的一种破坏数据封装和数据隐蔽的机制,友员给予别的类或非成员函数访问私有成员权利。 友元函数虽然可以访问类对象的私有成员,但它毕竟不是成员函数,它没有this指针, 但在某一时刻它究竟访问的是哪个对象的私有成员却很难确定,因此友元函数都带有传递对象的参数,显式的确定对象。 友员与成员函数的参数、实现代码和使用方式都有区别: 1.友员函数必须在参数中显式地指明要访问对象 2.成员函数在它自己的对象上操作 3.成员函数要访问的对象由 this 指针隐含传递13. 由于静态成员函数可以在没有声明类的任何实例(对象)之前就被执行,因此它们不能使用this指针。 友元函数是不能引用this指针的,因为它并非类的成员函数。 静态成员属于类,它不是属于对象的,不会随对象的消失而消失。 由于静态数据成员不属于特定的对象,因而不能使用构造函数和析构函数进行初始化和撤销; 静态成员函数仅属于一个类,不属于某一个特定的对象,因此它不能像一般的成员函数那样随意的 直接访问对象中的非静态的数据内容。如果要访问,则要在静态成员函数的输入参数中带指向对象的指针。14. class empty; 空类没有任何成员,包括数据和函数。 但空类对象大小不为零。15. 在C+中,结构也是一种类,与类的区别是默认访问权限为public.(与C兼容) 在C+中,联合也是一种类,联合也可以包含构造函数和析构函数,成员函数与友元函数。 联合的所有成员只能为公有成员。关键字 private不能用于联合(protected也不能用)。16. 构造函数 是一种用于创建对象特殊的成员函数 当创建对象时,系统自动调用构造函数,不能在程序中直接调用 构造函数可以有任意类型的参数,但不能具有返回类型17. 析构函数 是用于取消对象的成员函数 当一个对象作用域结束时,系统自动调用析构函数. 析构函数没有参数,也没有返回类型,析构函数没有重载。 可以使用完全限定名方式(带对象名,类名和函数名)显式地调用析构函数18. 默认拷贝构造函数仅完成对象的浅拷贝,如果类含有指针成员,也要完成指针所指数据的拷贝,这时 必须使用自定义的拷贝构造函数,重新开辟存储区,并逐个数组元素拷贝,制作完整副本,称为深拷贝.19. 派生类对基类成员可以有不同的访问方式: 1.派生类可以覆盖基类成员 2.派生类不能访问基类私有成员 3.公有继承 基类的公有段和保护段成员访问权对派生类保持不变 4.私有继承 基类的公有段和保护段成员成为派生类的私有成员20. 派生类构造函数声明为 派生类构造函数(参数表) : 基类(参数表) , 对象成员(参数表) 执行顺序:先长辈 基类再客人 对象成员后自己 派生类21. 如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的 名字进行访问时,可能产生二义性。 如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点, 这个公共基类就会在派生类的对象中产生多个基类子对象。 要使这个公共基类在派生类中只产生一个子对象,必须将这个基类声明为虚基类。22. 可以用一个指向基类的指针指向其公有派生类的对象。但却不能用指向派生类的指针指向一个基类对象. 希望用基类指针访问其公有派生类的特定成员,必须将基类指针用显式类型转换为派生类指针。23. 一个指向基类的指针可用来指向从基类公有派生的任何对象. 这一事实非常重要,它是C+实现运行时多态的关键途径24. 如果基类中的函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针 所指向的对象类型来调用派生类的函数。25. 纯虚函数是没有定义函数语句的基类虚函数,派生类必须为每一个基类纯虚函数提供相应的函数定义。 如果一个类中至少有一个纯虚函数,则该类称为抽象类。抽象类只能用作其他类的基类,抽象类不能建立对象。26. 运算符重载后,可以按它的表达方式使用,但不能改变它们的优先级,也不能改变算符要求的操作数数目。 一个运算符被重载后,原有意义没有失去,只是定义了相对一特定类的一个新运算符。 运算符函数 operator 用成员函数重载时,必须是共有的(public)27. 一元运算符函数 operator 用成员函数表示时,所需的一个操作数由对象通过this 指针隐含地传递, 因此参数表为空。 一元运算符函数 operator 用友员函数表示时,所需的一个操作数在参数表中由对象显式地提供, 因为友员函数没有this指针。 二元运算符函数 operator 用成员函数表示时,所需的二个操作数,有一个由对象通过this 指针隐含地传递, 因此它只有一个参数。 二元运算符函数 operator 用友员函数表示时,所需的二个操作数在参数表中由对象显式地提供, 因为友员函数没有this指针。28. C语言利用带参数的宏定义实现类属, C+利用模板实现类属. C+提供两种模板机制:函数模板 类模板29. 函数模板定义不是一个实实在在的函数,编译系统不为其产生任何执行代码。 调用函数模板时用实参(模板实参)对参数类型实例化,即实例化为模板函数, 这是由编译系统产生的可执行代码,之后才能执行。30. 类模板是类的抽象,类是对象的抽象。类的实例化是对象,类模板的实例化是(模板)类。31. 类属和继承的目的都在于提高软件模块的灵活性,取得代码共享。 类属是一种静态技术。模板实例化在编译时就能确定,具有执行速度快,可以容纳任意数据类型的优点; 继承是一种动态技术,支持增量式的模块构造策略,执行速度慢一些,但提供了更为灵活的动态链接技术; 虚函数提供了单界面多版本实现的多态性;32. catch()可以捕获任何异常,往往放在多个catch的最后,以避免有漏掉的异常;33. 如果一个函数抛掷一个异常,但在通往异常处理函数的调用链中找不到与之匹配的catch, 则该程序通常以abort( )函数调用中止;1 函数的例题int a=3, b=5;int max (int a, int b) return(a b ? a:b);main( ) a=8; cout“max is ”max( a, b)endl;*#include int x=11; void main( int z ) int y=x; int x=1; couty xendl; :x=2; y=x; couty xendl; cout:xendl;*main( ) main( ) int x=1; int x; int x=2; int x; int x=3; int x=3; cout“x=”xendl; cout“x=”xendl; cout“x=”xendl; cout“x=”xendl; cout“x=”xendl; cout“x=”xendl; *double x=1.0, y=2.0, z;main( ) double f( ); /* 定义在后,应加说明 */ z=f( ); cout“x=”xt“y=”yt“z=”zendl;double f( ) double y, z; x=y=z=3.0; return(x+y+z);*#includeint main(void) const int MAX=10; / MAX放在哪里? int array2=1,2,*p=array; coutAddress of MAX:&MAXendl; coutAddress of array:arrayendl; coutp of value:pendl; p=p+2; coutp of value:pendl; *p=12; cout“Value of p:”*pendl; /用单步调试看内存 coutMAX=MAXendl; /用单步调试看内存 coutAddress of MAX:MAXendl; return 1;*#include inline int add(int x, int y, int z)return x+y+z;void main( ) int x=2,y=3,z=4,sum; for(int i=1;i=10; i+) sum=add(x,y,z); cout“sum=”sumendl; x+, y+, z+; *#include void swap ( int &x, int &y ) int temp; temp=x; x=y; y=temp;void main ( ) /引用调用 int x=10, y=20; swap( x, y ); cout“x:”x“y:”yendl;*#include int Index=0;int & getIndex( )return Index;void main( )int n; /Index等于0n=getIndex( ); /Index等于0, n也等于0getIndex( )=5; cout+getIndex( )endl; 2 对象和类的例题# include class Tdate public: void set(int m, int d, int y ) month = m ; day = d ; year = y ; int isLeapYear() return ( year%4 = 0 & year%100 != 0 )|( year%400 = 0); void print() coutmonthendl; private: int month; int day; int year;void main() Tdate a; a.set(2,4,1998); a.print(); couta.isLeapYear()endl;*#include class catpublic: cat() for (int i = 0; i 10; i+) cout hello endl; inline void test () for (int i = 0; i 10; i+) cout test endl; protected:private:;int main () cat tom; tom.test (); return 0;*# include class t public : int x , y ; void print ( ) cout x “ , ” y ; ; ;void main ( ) t test ; test . x = 100 ; test . y = 200 ;/访问公有段数据成员 test . print ( ) ;/访问公有段成员函数*# include class t public : int x , y ; void print ( ) cout x “,” y x + ptf - y ) ; void main ( ) t test , * pt =&test; / 说明一个对象 test 和对象指针pt pt - x = 100 ; pt - y = 200 ; / 用指针访问对象数据成员 pt - print ( ) ; / 用指针访问对象成员函数 test . x = 150 ; test.y = 450 ; test . print ( ) ; cout “x+y=” add ( & test ) ;/ 把对象地址传给指针*# include class t public : int x , y ; void print ( ) cout x “,” y endl ; ; ;int add ( t & reft )/ reft是对象的别名 reft . print ( ) ;/ 用别名调用成员函数 return ( reft . x + reft . y ) ;/ 用别名访问数据成员void main ( ) t test ; test . x = 150 ; test . y = 450 ; cout “x+y=” add ( test ) ;/ 把对象的地址传给引用*# include class s public : int a ; int f ( ) return a- ; int g ( ) return a+ ; int h ( ) return a+ ; ;void main ( ) s ss ; ss . a = 100 ; cout “a=” ss . a endl ; cout “a=” ss . a“, f ( ) =” ss . f ( ) “, g ( ) =” ss . g ( ) “, h ( ) = ” ss . h ( ) )操作符访问对象的公有成员。 在类中定义的成员函数C+默认为内联的。 在类外定义的成员函数必须使用作用域区分符(:)指定函数的属性。 当创建对象时,C+自动定义一个指向对象的隐含的 this 指针。this 指针是局部于对象的常指针。3 构造函数的例题#includeclass Location public: Location(int xx, int yy);/ 带参数的构造函数 Location();/ 析构函数 int GetX(); int GetY(); private: int X, Y;Location:Location(int xx, int yy)/ 初始化数据成员 X=xx; Y=yy; coutConstructor called.endl; Location:Location() coutDestructor called.endl; int Location:GetX() return X; int Location:GetY() return Y; void main() Location A(10,20);/ 构造函数被调用 coutA.GetX(),A.GetY()endl;/ 析构函数被调用*#include#includeclass student public: student( char *pname, int xhours, float xgpa ) coutconstructing student pname endl; strncpy(name,pname,sizeof(name); semeshours = xhours; gpa=xgpa; student() coutdestructing nameendl;protected: char name20; int semeshours; float gpa;void main() student ss( Jenny, 22, 2.3 ) ; / 参数个数类型匹配*/ 使用默认参数的构造函数# include class Tdate public: Tdate ( int m=10, int d=1, int y=2000 ) ; protected: int month; int day; int year;Tdate : Tdate ( int m, int d, int y ) month = m; day = d; year = y ; cout month / day / year endl ;void main() Tdate aday ; Tdate bday ( 5 ) ; Tdate cday ( 2 , 12 ) ; Tdate dday ( 1 , 2 , 1998 ) ;*/不同构造函数的匹配class Tdate public: Tdate(); Tdate(int d); Tdate(int m, int d); Tdate(int m, int d, int y); protected: int month; int day; int year;Tdate : Tdate() month = 10 ; day = 1; year = 2000 ; cout month / day / year endl ; Tdate : Tdate ( int d ) month = 10 ; day = d ; year = 2000 ; cout month / day / year endl ; Tdate : Tdate ( int m, int d ) month = m ; day = d; year = 2000 ; cout month / day / year endl ; Tdate : Tdate ( int m, int d, int y ) month=m; day=d; year=y; coutmonth/day/yearendl;void main ( ) Tdate aday ; Tdate bday ( 5 ) ; Tdate cday ( 2, 12 ) ; Tdate dday ( 1, 2, 1998 ) ;*class studentID public: studentID ( int d =0) value = d ; cout Assigning student id value endl ; ; studentID( ) cout Destructing id value endl ; ; protected: int value; ;class student public: student ( char *pname = no name , int ssID = 0 ) : id ( ssID ) cout Constructing student pname endl ; strncpy ( name , pname , sizeof ( name ) ) ; ; protected: char name20 ; studentID id ;void main( ) student s (“Tom,9818) ; student t ( Jenny ) ; *例:class SillyClass public: SillyClass ( int & i ) : ten (10), ref ( i ) ;/ 只能使用初始化值表 protected: const int ten ;/ 常量数据成员 int & ref ;/ 引用数据成员 ;void main( ) int i ; SillyClass sc ( i ) ; 若有: SillyClass : SillyClass ( ) ten = 10 ;/ error,常量不能赋值 ref = i ;/ error,引用不能重新指派 ;4 静态成员的例题*/ 静态成员class counter static int num ; public : void setnum ( int i ) num = i ; void shownum ( ) cout num ; ;int counter : num = 0 ;/ 初始值为 0 可缺省void main ( ) counter a , b ; a . shownum ( ) ; b . shownum ( ) ; a . setnum ( 10 ) ; a . shownum ( ) ;b . shownum ( ) ;*例:使用静态数据成员记录对象个数# include class counter static int num ; public : counter ( ) cout + + num ; / 每创建一个对象 num 加 1 counter( ) cout num - - ; / 每删除一个对象 num 减 1 ;int counter : num = 0 ;void main ( ) cout endl ; counter a , b , c ; delete(&a); / a.counter(); cout endl ; *#include class X int member ; public : static void func ( int i , X * ptr ) ; ;void X:func ( int i , X * ptr ) member = i ;/ error,不知 member 引自哪一个对象? ptr - member = i ;/ 正确 coutmemberendl;void main ( ) X obj ; X : func ( 1, & obj ) ; / 正确,仅对静态成员函数正确 obj . func ( 1 , & obj ) ; / 正确,func ( ) 由 obj 激活,不是obj 的成员5 new和delete的例题*# include /创建和删除堆对象class Location public : Location ( int xx , int yy ) X=xx; Y=yy; cout “Constructor called:” X “,” Y endl ; ; Location ( ) cout “Constructor called.” endl ; ; Location ( ) cout “Destructor called.” endl ; ;private : int X, Y ; ;void main ( ) cout “Step One:” endl ; Location *ptr1; ptr1=new Location;/ 声明对象指针,并用创建的堆对象地址初始化 delete ptr1 ; cout “Step Two:” endl ; ptr1 = new Location ( 1, 2 ) ;/ 对象指针指向一个新创建的堆对象 delete ptr1 ;*/创建和删除堆对象数组# include class Location public : set ( int xx , int yy ) ; Location ( ) cout “Destructor called:” X “,” Y endl ; ; private : int X , Y ; ;Location : set ( int xx , int yy ) X=xx; Y=yy; cout “Constructor:” X “,” Y endl ; return 0 ; ;void main ( ) Location * ptr; ptr= new Location 2 ;/ 堆对象数组初始化指针 ptr 0 . set ( 5 , 10 ) ;/ 调用成员函数 ptr 1 . set ( 15 , 20 ) ; cout “Deleting .” endl ; delete ptr ;*class Location public : Location ( int xx = 0 , int yy = 0 ) X = xx ; Y = yy ; Location ( Location & p ) ; int GetX ( ) return X ; int GetY ( ) return Y ; private : int X , Y ;Location : Location ( Location & p) X=p.X; Y=p.Y; cout “Copy_constructor called.” endl ; main ( ) Location A ( 1 , 2 ) ; Location B ( A ) ;/ 拷贝构造函数被调用 cout “B:” B.GetX ( ) “,” B.GetY ( ) endl ;*class Location public : Location ( int xx = 0 , int yy = 0 ) X = xx ; Y = yy ; int GetX ( ) return X ; int GetY ( ) return Y ; private : int X , Y ;main ( ) Location A ( 1 , 2 ) ; Location B ( A ) ;/调用缺省构造函数 cout “B:” B.GetX ( ) “,” B.GetY ( ) endl ;*class Location public : Location ( int xx = 0 , int yy = 0 ) X = xx ; Y = yy ; Location ( Location & p ) ; Location ( ) cout X “,” Y “ Object destroyed.” endl ; int GetX ( ) return X ; int GetY ( ) return Y ; private : int X , Y ; ;Location : Location ( Location & p)/ 拷贝构造函数 X = p.X ; Y = p.Y ; cout “Copy_constructor called.” endl ; void f ( Location p

温馨提示

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

评论

0/150

提交评论