序
C++基础专项练习二,,,水平依然不到家!
错题分析与总结
1 . 有如下模板定义:
template <class T>
T fun(T x,T y){
return x*x+y*y;
}
在下列对fun的调用中,错误的是()
A. fun(1, 2)
B. fun(1.0, 2)
C. fun(2.0, 1.0)
D. fun(1, 2.0)
分析:这是一道C++模板的题目,模板函数的调用,这里主要是要求函数参数返回值的类型一致;
对于选项A,参数都是int类型,符合要求;选项B,参数为浮点型与整型,类型不一致,错误;选项C,参数都是浮点型,类型一致;选项D,通过强制类型转换,将参数都转换为浮点型,类型一致;
答案:B
总结:错选D,对模板函数的调用了解不透彻;
2 . c++中,声明const int i,是在哪个阶段做到 i只可读的?
A. 编译
B. 链接
C. 运行
D. 以上都不对
分析:const用来说明所定义的变量是只读的。 这些在编译期间完成,编译器可能使用常数直接替换掉对此变量的引用。
答案:A
总结:错选C
3 .类成员函数的重载、覆盖和隐藏区别描述正确的有?
A .覆盖是指在同一个类中名字相同,参数不同
B .重载是指派生类函数覆盖基类函数,函数相同,参数相同,基类函数必须有virtual关键字
C .派生类函数与基类函数相同,但是参数不同,会”隐藏”父类函数
D .函数名字相同,参数相同,基类无virtual关键字的派生类的函数会”隐藏”父类函数
分析:关于类成员函数的重载、覆盖和隐藏概念非常相似,下面总结如下:
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
答案: CD 此题是多项选择
4 .下面这个程序执行后会有什么错误或者效果:
#define MAX 255
int main()
{
unsigned char A[MAX], i;
for (i = 0; i <= MAX; i++)
A[i] = i;
}
A. 数组越界
B. 死循环
C. 栈溢出
D. 内存泄露
分析: 死循环加数组越界访问(C/C++不进行数组越界检查 MAX=255;
(1)数组A的下标范围为:0….MAX-1;
(2)当i循环到255时,循环内执行: A[255]=255;这句本身没有问题,但是返回for (i=0;i<=MAX;i++)语句时,由于unsigned char的取值范围在(0..255),i++以后i又为0了,这样就会无限循环下去,造成了死循环;
答案: AB
5 .关于static用途说法正确的是?
A .声明静态外部类
B .声明静态外部全局变量
C .声明静态外部函数
D .声明静态局部变量
分析:类型声明符在C语言里面主要有三个用途:
1:设置静态局部变量,变量只定义一次,不能被别的函数使用
2:设置静态全局变量,变量不能被外部文件所使用
3:在类中设置静态函数,只能访问静态变量
答案:BCD
6 .请找出下面代码中的所有错误。说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”?
1 #include "string.h"
2 int main()
3 {
4 char *src = "hello,world";
5 char *dest = NULL;
6 int len = strlen(src);
7 dest = (char *)malloc(len);
8 char *d = dest;
9 char *s = src[len];
10 while (len-- != 0)
11 d++ = s--;
12 printf("%s", dest);
13 return 0;
14 }
A .第7行要为’\0’分配一个空间
B .第9行改成char * s = &src[len-1]
C .第12行前要加上*d = 0;
D .第13行前要加上free(dest)释放空间
分析:
int main()
{
char *src = "hello,world";
int len = strlen(src);
char *dest = (char *)malloc(len + 1); //要为\0分配一个空间
char *d = dest;
char *s = &src[len - 1]; //指向最后一个字符
while ( len-- != 0 )
*d++ = *s--;
*d = 0; //尾部要加\0
printf("%s\n", dest);
free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
return 0;
}
答案:ABCD
精题收藏
1 . 下列一段C++代码的输出是?
#include "stdio.h"
class Base
{
public:
int Bar(char x)
{
return (int)(x);
}
virtual int Bar(int x)
{
return (2 * x);
}
};
class Derived : public Base
{
public:
int Bar(char x)
{
return (int)(-x);
}
int Bar(int x)
{
return (x / 2);
}
};
int main(void)
{
Derived Obj;
Base *pObj = &Obj;
printf("%d,", pObj->Bar((char)(100)));
printf("%d,", pObj->Bar(100));
}
A .100,-100
B .100,50
C .200,-100
D .200,50
分析:
Derived Obj;
Base *pObj = &Obj;
printf(“%d,”, pObj->Bar((char)(100)))
printf(“%d,”, pObj->Bar(100));
第一个Bar(char)是非虚函数,因此是静态绑定,静态绑定是指指针指向声明时的对象,pObj声明时为Base类,因此调用的是Base类的Bar(char)
第二个Bar(char)是虚函数,因此是动态绑定,动态绑定是指指针指向引用的对象,pObj引用Derived对象,因此调用的是Derived类的Bar(int)