1、C+练习题C+自测练习1. 参考教材312请问以下程序为什么只输出了一组:,而没有输出两组?#include#includeclass Apublic: A()coutCAendl; A()coutDAendl;private: int x;int main() A *pa = (A *)malloc(sizeof(A); free(pa); pa = NULL; A *pb = new A; delete pb;2. 参考教材314、315页。请问以下程序调用的是哪个构造函数,程序输出什么?#includeclass Apublic: A()coutCA0endl; A(int i)cout
2、CA1endl; A()coutDAendl;private: int x;int main() A *pb = new A(9); delete pb;3. 参考教材314、315页。请问以下程序输出什么?delete pb是否可以写成这样:delete pb#includeclass Apublic: A()coutCA0endl; A(int i)coutCA1endl; A()coutDAendl;private: int x;int main() A *pb = new A10; delete pb;4. 参考教材316、317页。请问以下程序输出什么?当程序执行到A b(a)时输出
3、什么?当程序执行到f1(a)时输出什么?当程序执行到f2(a)时输出什么?#includeclass Apublic: A()x=0; coutCA0endl; A(int i)x=i; coutCA1endl; A(A &r)x=r.x; coutCA2endl; A()coutDAendl;private: int x;void f1(A m)void f2(A &m)int main() A a; A b(a); f1(a); f2(a);5. 参考教材320、321图14-2,322图14-3 ,浅拷贝和深拷贝的概念。请问下面哪个程序段使用的是深拷贝,哪个是浅拷贝?程序1还是程序2,C
4、+提供的默认拷贝构造函数是深拷贝还是浅拷贝?/程序1#include#includeclass Apublic: A(char *s)p=new charstrlen(s)+1;strcpy(p,s); A(A &r)p=r.p;private: char *p;int main() A a(nihao); A b(a);/程序2#include#includeclass Apublic: A(char *s)p=new charstrlen(s)+1;strcpy(p,s); A(A &r)p=new charstrlen(r.p)+1;strcpy(p,r.p);private: char
5、 *p;int main() A a(nihao); A b(a);6. 继承的工作方式,参考教材350、352图16-2。参考课件继承与派生22-25页。完成以下代码。要求:(1)处继承方式为共有继承,(2)处填写基类的ai,(3)处填写派生类的bi,(4)对象b的数据成员有哪些?#include#includeclass Apublic: A()ai=1;protected: int ai;class B: _(1)_ Apublic: B()bi=2; void display()cout_(2)_ _(3)_endl;private: int bi;int main() B b; b.
6、display();7. #include#includeclass Apublic: A()coutCAendl;int main()#include#includeclass Apublic: A()coutCAendl;A me;int main()为何左侧程序有输出,而右侧程序没有输出?8. 派生类的构造,参考教材352页、353。派生类的构造总是由基类的初始化开始的。填写代码,完成基类的初始化。并且要求屏幕输出效果是:#includeclass Apublic: A(int i)x=i; coutCA:xendl; A()coutDAendl;private: int x;class
7、 B:public Apublic: B():_(1)_y=0;coutCBendl; B()coutDBendl;private: int y;int main() B b;9. 参考教材353。填写初始化列表,完成以下程序,使得屏幕输出:#includeclass Apublic: A(int i)x=i; coutxendl;private: int x;class Dpublic: D(int i)m=i;coutmendl;private: int m;class B:public Apublic: B():_(1)_y=0;private: int y; D d;int main(
8、) B b;10. 以下代码有什么错误,如何解决这个错误。#includeclass Apublic: A(int i)x=i; coutxendl;private: int x;class Bpublic: B()private: A a(12); const int y=13;int main() B b;11. 参考教材352页、图16-2。请问以下程序输出什么?#includeclass Apublic: A(int i)x=i; int x;class B:public Apublic: B(int i):A(i+1)y=i; int y;int main() B b(3); A &
9、ra = b; A *pa = &b; coutra.xendl; coutxendl;12. 参考教材352页、图16-2。请问以下程序输出什么? #includeclass Apublic: A(int i)x=i; int x;class B:public Apublic: B(int i):A(i+1)y=i; int y;void f1(A & ra) coutra.xendl;void f2(A * pa) coutxendl;int main() B b(3); f1(b); f2(&b);13. 参考教材352页、图16-2。请问以下程序输出什么?#includeclass A
10、public: A(int i)x=i; int x;class B:public Apublic: B(int i):A(i)y=i; int y;class C:public Apublic: C(int i):A(i)m=i;n=i;j=i;k=i; int m,n,j,k;int main() A * pa10; int i=0; for(i=0;i3;+i) pai = new B(1); for(i=3;i10;+i) pai = new C(2); for(i=0;i10;+i) coutx ;14. 请问以下程序输出什么?#includeclass Apublic: void
11、display()coutAendl;class B:public Apublic: void display()coutBdisplay(); pa-display();15. 请问以下程序输出什么?#includeclass Apublic: void display()coutAendl;class B:public Apublic: void display()coutBendl;void f(A &r) r.display();int main() B b; f(b); A a; f(a);16. 多态性,虚函数,参考教材358.多态性分为两种:一种是编译时的多态性,另一种是运行时的
12、多态性。编译时的多态性是通过函数的重载来实现的,函数的重载是根据函数调用时给出的不同类型的实参或不同的实参个数,在程序执行前就可以确定应该调用哪一个函数。运行时的多态性是指在执行之前,根据函数名和参数无法确定应该调用哪一个函数,必须在程序的执行过程中,根据具体的执行情况来动态地确定。这种多态性是通过类的继承关系和虚函数来实现的。实现运行时的多态性,必须使用基类类型的指针变量,使该指针指向不同派生类的对象,并通过调用指针所指向的虚函数才能实现运行的多态性。虚函数与一般的成员函数相比较,调用时的执行速度要慢一些。请问以下程序输出什么?#includeclass Apublic: virtual v
13、oid display()coutAendl;class B:public Apublic: virtual void display()coutBendl;void f(A &r) r.display();int main() B b; f(b); A a; f(a);17. 请问以下程序输出什么?#includeclass Apublic: virtual void display()coutAendl;class B:public Apublic: virtual void display()coutBendl;class C:public Apublic: virtual void d
14、isplay()coutCendl;int main() A a,aa; B b; C c,cc,ccc; A *pa6=&a,&aa,&b,&c,&cc,&ccc; int i=0; for(i=0;idisplay();18. 以下程序的屏幕输出是:。为何以下程序的屏幕输出中会输出DA呢?请说明。#includeclass Apublic: A()coutDA ;class B:public Apublic: B()coutDB ;int main() B b;19. 请问以下程序输出什么?为何没有输出DB?#includeclass Apublic: A()coutDA ;class B
15、:public Apublic: B()coutDB ;int main() A *pa; pa = new A; delete pa; pa = new B; delete pa;20. 请问以下程序输出什么?是在编译时就确定了调用哪个析构函数,还是在运行时才确定了调用哪个析构函数?#includeclass Apublic: virtual A()coutDA ;class B:public Apublic: virtual B()coutDB ;int main() A *pa; pa = new B; delete pa;21. 以下程序的屏幕输出是:请解释为何第一行输出:请解释为何第
16、二行输出:请解释为何第三行输出:请解释为何第四行输出:#includeclass Apublic: A()coutCA ; virtual A()coutDA ; virtual void display()coutdisplayA ; void print()coutprintA ;class B:public Apublic: B()coutCB ; virtual B()coutDB ; virtual void display()coutdisplayB ; void print()coutprintB ;class C:public Apublic: C()coutCC ; virtual C()coutDC ; virtual void display()coutdisplayC ; void print()coutprintC ;int main() int i; A *pa6; for(i=0;i3;+i) pai = new A; for(i=3;i4;+i) pai = new B; for(i=4;i6;+i) pai = new C; coutendl; for(i=0;idisplay(); coutendl; for(i=0;iprint(); coutendl; for(i=0;i6;+i) delete pai; coutendl;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1