文章目录
一. 单选
1. 假设A为抽象类,下列声明()是正确的
A int fun(A);
B A Obj;
C A fun(int);
D A *p;
正确答案:D
抽象类不能实例化对象
建立相对应类型的指针,并不是实例化对象
2. 虚函数可不可以重载为内联?
A 可以
B 不可以
C 语法错误
正确答案:B
3. 下面有关虚函数的描述,说法错误的是?
A 虚函数的作用是实现了继承性
B 虚函数的作用就是实现“动态联编”,也就是在程序的运行阶段动态地选择合适的成员函数
C 和类的静态成员函数与非类的成员函数相比,虚函数的效率较低
D 要正确的实现虚函数,只能用一个基类的指针或者引用来指向派生类对象
正确答案:A
继承主要的目的是实现多态——虚函数,反之是不成立的
4.下面这个代码输出的是()
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
vector<int>array;
array.push_back(100);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(500);
vector<int>::iterator itor;
for(itor=array.begin();itor!=array.end();itor++)
{
if(*itor==300)
{
itor=array.erase(itor);
}
} f
or(itor=array.begin();itor!=array.end();itor++)
{
cout<<*itor<<"";
}
return 0;
}
A 100 300 300 300 300 500
B 100 300 300 300 500
C 100 300 300 500
D 100 300
正确答案:C
不会删除所有的300
迭代器会接受删除之后的的位置,然后++就会跳过两个300
5. 在 C++ 中,用于实现动态多态性的是( )。
A 内联函数
B 重载函数
C 模板函数
D 虚函数
正确答案:D
6. 调用一成员函数时, 使用动态联编的情况是()
A 通过对象调用一虚函数
B 通过指针或引用调用一虚函数
C 通过对象调用静态函数
D 通过指针或应用调用一静态函数
正确答案:B
7. 下面有关继承、多态、组合的描述,说法错误的是?
A 封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对
不可信的进行信息隐藏
B 继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
C 隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了
D 覆盖是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同
正确答案:D
《高质量C++编程》第七章 重载、隐藏、覆盖
覆盖必须达到三同——虚函数重写
8. “引用”与多态的关系?
A 两者没有关系
B 引用可以作为产生多态效果的手段
C 一个基类的引用不可以指向它的派生类实例
D 以上都不正确
正确答案:B
多态必须通过父类的指针或引用调用虚函数
9. 下面这段程序的输出是什么?
class A{
public:
A(){p();}
virtual void p(){print("A")}
virtual ~A(){p();}
};
class B:public A{
public:
B(){p();}
void p(){print("B")}
~B(){p();}
};
int main(int, char**){
A* a=new B();
delete a;
}
A AABB
B BBAA
C ABAB
D ABBA
正确答案:D
先构造的后析构
10. 以下代码的运行结果为()
class Base {
public:
Base() {
echo();
} v
irtual void echo() {
printf("Base");
}
};
class Derived:public Base {
public:
Derived() {
echo();
} v
irtual void echo() {
printf("Derived");
}
};
int main() {
Base* base = new Derived();
base->echo();
return 0;
}
A DerivedDerivedDerived
B DerivedBaseDerived
C BaseDerivedBase
D BaseDerivedDerived
正确答案:D
new子类先构造父类,再构造子类: BaseDerived
虚函数重写调子类:Derived
二. 编程
1.杨辉三角的变形
以上三角形的数阵,第一行只有一个数1,以下每行的每个数,是恰好是它上面的数、左上角数和右上角的数,3个数之和(如果不存在某个数,认为该数就是0)。
求第n行第一个偶数出现的位置。如果没有偶数,则输出-1。例如输入3,则输出2,输入4则输出3,输入2则输出-1。
输入描述:
输入一个int整数
输出描述:
输出返回的int值
示例1:
输入
4 输
出
3
根据规律:
偶数在左半部分
{-1,-1,2,3,2,4,2,3,2,4,…}
正确答案:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
while(cin>> n)
{
if(n<=2)
cout<<-1<<endl;
else if(n%4 == 1 || n%4 == 3)
cout<<2<<endl;
else if(n%4 == 2)
cout<<4<<endl;
else
cout<<3<<endl;
}
return 0;
}
另一种写法:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
int a[] = {4,2,3,2};
while(cin>> n)
{
int ret = -1;
if(n>2){
ret = a[(n-2)%4];
}
cout<<ret<<endl;
}
return 0;
}
2. 计算某字符出现次数
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)
输入描述:
第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字符。
输出描述:
输出输入字符串中含有该字符的个数。(不区分大小写字母)
示例1:
输入
ABCabc
A
输出
2
正确答案:
C语言
#include <stdio.h>
#include <string.h>
int main()
{
char str[1003] = { 0 };
//gets函数获取一行数据,因为会连带最后的换行一起获取,所以不用担心遗留的换行对后续输入造成影响
gets(str);
char find;
scanf("%c", &find);//捕捉要查找的字符
int count[128] = { 0 };//用于记录每个字符出现次数
int len = strlen(str);//获取字符串实际长度
for (int i = 0; i < len; i++) {
count[str[i]] += 1; //对应字符的位置计数+1
} int res = count[find];
if (find >= 'A' && find <= 'Z') {//如果是A-Z需要将a-z对应的计数加上
res += count[find + 32];
} else if (find >= 'a' && find <= 'z') {//如果是a-z需要将A-Z对应的计数加上
res += count[find - 32];
} printf("%d\n", res);
return 0;
}