C++练习题.docx
《C++练习题.docx》由会员分享,可在线阅读,更多相关《C++练习题.docx(16页珍藏版)》请在冰豆网上搜索。
C++练习题
C++自测练习
1.参考教材312请问以下程序为什么只输出了一组:
,而没有输出两组?
#include
#include
classA{
public:
A(){cout<<"CA"<~A(){cout<<"DA"<private:
intx;
};
intmain()
{
A*pa=(A*)malloc(sizeof(A));
free(pa);
pa=NULL;
A*pb=newA;
deletepb;
}
2.参考教材314、315页。
请问以下程序调用的是哪个构造函数,程序输出什么?
#include
classA{
public:
A(){cout<<"CA0"<A(inti){cout<<"CA1"<~A(){cout<<"DA"<private:
intx;
};
intmain()
{
A*pb=newA(9);
deletepb;
}
3.参考教材314、315页。
请问以下程序输出什么?
delete[]pb是否可以写成这样:
deletepb
#include
classA{
public:
A(){cout<<"CA0"<A(inti){cout<<"CA1"<~A(){cout<<"DA"<private:
intx;
};
intmain()
{
A*pb=newA[10];
delete[]pb;
}
4.参考教材316、317页。
请问以下程序输出什么?
当程序执行到Ab(a)时输出什么?
当程序执行到f1(a)时输出什么?
当程序执行到f2(a)时输出什么?
#include
classA{
public:
A(){x=0;cout<<"CA0"<A(inti){x=i;cout<<"CA1"<A(A&r){x=r.x;cout<<"CA2"<~A(){cout<<"DA"<private:
intx;
};
voidf1(Am)
{}
voidf2(A&m)
{}
intmain()
{
Aa;
Ab(a);
f1(a);
f2(a);
}
5.参考教材320、321图14-2,322图14-3,浅拷贝和深拷贝的概念。
请问下面哪个程序段使用的是深拷贝,哪个是浅拷贝?
程序1还是程序2,C++提供的默认拷贝构造函数是深拷贝还是浅拷贝?
//程序1
#include
#include
classA{
public:
A(char*s){p=newchar[strlen(s)+1];strcpy(p,s);}
A(A&r){p=r.p;}
private:
char*p;
};
intmain()
{
Aa("nihao");
Ab(a);
}
//程序2
#include
#include
classA{
public:
A(char*s){p=newchar[strlen(s)+1];strcpy(p,s);}
A(A&r){p=newchar[strlen(r.p)+1];strcpy(p,r.p);}
private:
char*p;
};
intmain()
{
Aa("nihao");
Ab(a);
}
6.继承的工作方式,参考教材350、352图16-2。
参考课件《继承与派生》22-25页。
完成以下代码。
要求:
(1)处继承方式为共有继承,
(2)处填写基类的ai,(3)处填写派生类的bi,(4)对象b的数据成员有哪些?
#include
#include
classA{
public:
A(){ai=1;}
protected:
intai;
};
classB:
____
(1)____A{
public:
B(){bi=2;}
voiddisplay(){cout<<____
(2)____<<____(3)____<private:
intbi;
};
intmain()
{
Bb;
b.display();
}
7.
#include
#include
classA{
public:
A(){cout<<"CA"<};
intmain()
{
}
#include
#include
classA{
public:
A(){cout<<"CA"<};
Ame;
intmain()
{
}
为何左侧程序有输出,而右侧程序没有输出?
8.派生类的构造,参考教材352页、353。
派生类的构造总是由基类的初始化开始的。
填写代码,完成基类的初始化。
并且要求屏幕输出效果是:
#include
classA{
public:
A(inti){x=i;cout<<"CA:
"<~A(){cout<<"DA"<private:
intx;
};
classB:
publicA{
public:
B():
___
(1)___{y=0;cout<<"CB"<~B(){cout<<"DB"<private:
inty;
};
intmain()
{
Bb;
}
9.参考教材353。
填写初始化列表,完成以下程序,使得屏幕输出:
#include
classA{
public:
A(inti){x=i;cout<private:
intx;
};
classD{
public:
D(inti){m=i;cout<private:
intm;
};
classB:
publicA{
public:
B():
__
(1)___{y=0;}
private:
inty;
Dd;
};
intmain()
{
Bb;
}
10.以下代码有什么错误,如何解决这个错误。
#include
classA{
public:
A(inti){x=i;cout<private:
intx;
};
classB{
public:
B(){}
private:
Aa(12);
constinty=13;
};
intmain()
{
Bb;
}
11.参考教材352页、图16-2。
请问以下程序输出什么?
#include
classA{
public:
A(inti){x=i;}
intx;
};
classB:
publicA{
public:
B(inti):
A(i+1){y=i;}
inty;
};
intmain()
{
Bb(3);
A&ra=b;
A*pa=&b;
cout<cout<x<}
12.参考教材352页、图16-2。
请问以下程序输出什么?
#include
classA{
public:
A(inti){x=i;}
intx;
};
classB:
publicA{
public:
B(inti):
A(i+1){y=i;}
inty;
};
voidf1(A&ra)
{
cout<}
voidf2(A*pa)
{
cout<x<}
intmain()
{
Bb(3);
f1(b);
f2(&b);
}
13.参考教材352页、图16-2。
请问以下程序输出什么?
#include
classA{
public:
A(inti){x=i;}
intx;
};
classB:
publicA{
public:
B(inti):
A(i){y=i;}
inty;
};
classC:
publicA{
public:
C(inti):
A(i){m=i;n=i;j=i;k=i;}
intm,n,j,k;
};
intmain()
{
A*pa[10];
inti=0;
for(i=0;i<3;++i)
pa[i]=newB
(1);
for(i=3;i<10;++i)
pa[i]=newC
(2);
for(i=0;i<10;++i)
cout<x<<"";
}
14.请问以下程序输出什么?
#include
classA{
public:
voiddisplay(){cout<<"A"<};
classB:
publicA{
public:
voiddisplay(){cout<<"B"<};
intmain()
{
Bb;
B*pb=&b;
A*pa=&b;
pb->display();
pa->display();
}
15.请问以下程序输出什么?
#include
classA{
public:
voiddisplay(){cout<<"A"<};
classB:
publicA{
public:
voiddisplay(){cout<<"B"<};
voidf(A&r)
{
r.display();
}
intmain()
{
Bb;
f(b);
Aa;
f(a);
}
16.多态性,虚函数,参考教材358.
多态性分为两种:
一种是编译时的多态性,另一种是运行时的多态性。
编译时的多态性是通过函数的重载来实现的,函数的重载是根据函数调用时给出的不同类型的实参或不同的实参个数,在程序执行前就可以确定应该调用哪一个函数。
运行时的多态性是指在执行之前,根据函数名和参数无法确定应该调用哪一个函数,必须在程序的执行过程中,根据具体的执行情况来动态地确定。
这种多态性是通过类的继承关系和虚函数来实现的。
实现运行时的多态性,必须使用基类类型的指针变量,使该指针指向不同派生类的对象,并通过调用指针所指向的虚函数才能实现运行的多态性。
虚函数与一般的成员函数相比较,调用时的执行速度要慢一些。
请问以下程序输出什么?
#include
classA{
public:
virtualvoiddisplay(){cout<<"A"<};
classB:
publicA{
public:
virtualvoiddisplay(){cout<<"B"<};
voidf(A&r)
{
r.display();
}
intmain()
{
Bb;
f(b);
Aa;
f(a);
}
17.请问以下程序输出什么?
#include
classA{
public:
virtualvoiddisplay(){cout<<"A"<};
classB:
publicA{
public:
virtualvoiddisplay(){cout<<"B"<};
classC:
publicA{
public:
virtualvoiddisplay(){cout<<"C"<};
intmain()
{
Aa,aa;
Bb;
Cc,cc,ccc;
A*pa[6]={&a,&aa,&b,&c,&cc,&ccc};
inti=0;
for(i=0;i<6;++i)
pa[i]->display();
}
18.以下程序的屏幕输出是:
。
为何以下程序的屏幕输出中会输出DA呢?
请说明。
#include
classA{
public:
~A(){cout<<"DA";}
};
classB:
publicA{
public:
~B(){cout<<"DB";}
};
intmain()
{
Bb;
}
19.请问以下程序输出什么?
为何没有输出DB?
#include
classA{
public:
~A(){cout<<"DA";}
};
classB:
publicA{
public:
~B(){cout<<"DB";}
};
intmain()
{
A*pa;
pa=newA;
deletepa;
pa=newB;
deletepa;
}
20.请问以下程序输出什么?
是在编译时就确定了调用哪个析构函数,还是在运行时才确定了调用哪个析构函数?
#include
classA{
public:
virtual~A(){cout<<"DA";}
};
classB:
publicA{
public:
virtual~B(){cout<<"DB";}
};
intmain()
{
A*pa;
pa=newB;
deletepa;
}
21.以下程序的屏幕输出是:
请解释为何第一行输出:
请解释为何第二行输出:
请解释为何第三行输出:
请解释为何第四行输出:
#include
classA{
public:
A(){cout<<"CA";}
virtual~A(){cout<<"DA";}
virtualvoiddisplay(){cout<<"displayA";}
voidprint(){cout<<"printA";}
};
classB:
publicA{
public:
B(){cout<<"CB";}
virtual~B(){cout<<"DB";}
virtualvoiddisplay(){cout<<"displayB";}
voidprint(){cout<<"printB";}
};
classC:
publicA{
public:
C(){cout<<"CC";}
virtual~C(){cout<<"DC";}
virtualvoiddisplay(){cout<<"displayC";}
voidprint(){cout<<"printC";}
};
intmain()
{
inti;
A*pa[6];
for(i=0;i<3;++i)pa[i]=newA;
for(i=3;i<4;++i)pa[i]=newB;
for(i=4;i<6;++i)pa[i]=newC;
cout<for(i=0;i<6;++i)pa[i]->display();
cout<for(i=0;i<6;++i)pa[i]->print();
cout<for(i=0;i<6;++i)deletepa[i];
cout<}