目录
一、选择题
二、编程题
三、选择题题解
四、编程题题解
一、选择题
1、假设A为抽象类,下列声明()是正确的
A. int fun(A);
B. A Obj;
C. A fun(int);
D. A *p;
2、虚函数可不可以重载为内联?
A. 可以
B. 不可以
C. 语法错误
3、下面有关虚函数的描述,说法错误的是?
A. 虚函数的作用是实现了继承性
B. 虚函数的作用就是实现“动态联编”,也就是在程序的运行阶段动态地选择合适的成员函数
C. 和类的静态成员函数与非类的成员函数相比,虚函数的效率较低
D. 要正确的实现虚函数,只能用一个基类的指针或者引用来指向派生类对象
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);
}
}
for(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
5、在 C++ 中,用于实现动态多态性的是( )。
A. 内联函数
B. 重载函数
C. 模板函数
D. 虚函数
6、调用一成员函数时, 使用动态联编的情况是()
A. 通过对象调用一虚函数
B. 通过指针或引用调用一虚函数
C. 通过对象调用静态函数
D. 通过指针或应用调用一静态函数
7、下面有关继承、多态、组合的描述,说法错误的是?
A. 封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
B. 继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
C. 隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了
D. 覆盖是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同
8、“引用”与多态的关系?
A. 两者没有关系
B. 引用可以作为产生多态效果的手段
C. 一个基类的引用不可以指向它的派生类实例
D. 以上都不正确
9、下面这段程序的输出是什么?
class A
{
public:
A(){p();}
virtual void p(){printf("A")}
virtual ~A(){p();}
};
class B:public A
{
public:
B(){p();}
void p(){printf("B")}
~B(){p();}
};
int main(int, char**)
{
A* a=new B();
delete a;
return 0;
}
A. AABB
B. BBAA
C. ABAB
D. ABBA
10、以下代码的运行结果为()
class Base
{
public:
Base()
{
echo();
}
virtual void echo()
{
printf("Base");
}
};
class Derived:public Base
{
public:
Derived()
{
echo();
}
virtual void echo()
{
printf("Derived");
}
};
int main()
{
Base* base = new Derived();
base->echo();
return 0;
}
A. DerivedDerivedDerived
B. DerivedBaseDerived
C. BaseDerivedBase
D. BaseDerivedDerived
二、编程题
1、杨辉三角的变形 题目链接
2、计算某字符出现次数 题目链接
三、选择题题解
1、假设A为抽象类,下列声明()是正确的
A. int fun(A);
B. A Obj;
C. A fun(int);
D. A *p;
正确答案:D
题解:
抽象类不能实例化出对象;A选项,传值传参必然需要调用拷贝构造,实例化对象故错误;B选项,定义一个A类,也要实例化A类对象;C选项,传值返回必须调用拷贝构造,则必须实例化出对象;D选项,定义指针不会实例化出对象;
2、虚函数可不可以重载为内联?
A. 可以
B. 不可以
C. 语法错误
正确答案:B
题解:
虚函数不能重载为内联函数,因为内联函数并不会有地址,只是在调用出展开;
3、下面有关虚函数的描述,说法错误的是?
A. 虚函数的作用是实现了继承性
B. 虚函数的作用就是实现“动态联编”,也就是在程序的运行阶段动态地选择合适的成员函数
C. 和类的静态成员函数与非类的成员函数相比,虚函数的效率较低
D. 要正确的实现虚函数,只能用一个基类的指针或者引用来指向派生类对象
正确答案:A
题解:
虚函数是实现多态的条件之一,于继承并无关系;故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);
}
}
for(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
题解:
此处考察vector中erase函数时迭代器失效问题,当我们删除vector中一个元素时,返回的是删除元素的下一个元素位置的迭代器,当vector有 100 300 300 300 300 500时,我们进入循环,首先判断第一个元素是否等于300,结果是不等于300,因此对迭代器进行++来到第二个元素的位置,进入下一个循环;继续判断发现迭代器指向的值等于300,因此删除这个元素,并返回下一个元素的位置,此时注意了,我们除了 if 语句后,再次对迭代器进行了++,而正好跳过了一个300,后面依次类推,这就是300没有删除干净的原因,最后答案为C;
5、在 C++ 中,用于实现动态多态性的是( )。
A. 内联函数
B. 重载函数
C. 模板函数
D. 虚函数
正确答案:D
题解:
我们通过函数重载完成静态的多态,虚函数的重写完成动态多态;故选D;
6、调用一成员函数时, 使用动态联编的情况是()
A. 通过对象调用一虚函数
B. 通过指针或引用调用一虚函数
C. 通过对象调用静态函数
D. 通过指针或应用调用一静态函数
正确答案:B
题解:
所谓动态联编指的是程序在编译期间,无法确定调用哪个函数,只能在运行期间才可以得知,简单来说,这不就是我们C++里的多态嘛,而形成多态有两个条件,并且缺一不可,其一是虚函数的重写;其二是父类的指针或引用调用;故选B;
7、下面有关继承、多态、组合的描述,说法错误的是?
A. 封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
B. 继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
C. 隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了
D. 覆盖是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同
正确答案:D
题解:
D选项,覆盖即虚函数的重写,要求函数返回值相同,函数名相同,函数参数列表相同(除协变与析构函数的特殊情况除外);故D错误;
8、“引用”与多态的关系?
A. 两者没有关系
B. 引用可以作为产生多态效果的手段
C. 一个基类的引用不可以指向它的派生类实例
D. 以上都不正确
正确答案:B
题解:
形成多态的条件之一就是父类的指针或引用来调用虚函数;
9、下面这段程序的输出是什么?
class A
{
public:
A(){p();}
virtual void p(){printf("A")}
virtual ~A(){p();}
};
class B:public A
{
public:
B(){p();}
void p(){printf("B")}
~B(){p();}
};
int main(int, char**)
{
A* a=new B();
delete a;
return 0;
}
A. AABB
B. BBAA
C. ABAB
D. ABBA
正确答案:D
题解:
仔细观出题目,我们的有一对父子类,其构造和析构函数都调用了虚函数p,且p在子类完成了重写;要做这题,首先我们得知道在构造函数与析构函数中,我们调用虚函数不会有多态性;比如在调用构造函数时,虚表还没产生,故没有多态性;我们在看题目我们首先new了一个子类对象,该对象会先调用父类的构造,构造函数中调用函数不会有多态性,因此我们会打印A;随后调用子类的构造,同样调用p函数,打印B;接着我们delete base对象,base对象是父类的指针,且指向的是子类对象,此时达成了多态,先析构子类,在析构父类,析构函数中调用的函数也不会有多态,因此打印分别B、A;最终答案D;
10、以下代码的运行结果为()
class Base
{
public:
Base()
{
echo();
}
virtual void echo()
{
printf("Base");
}
};
class Derived:public Base
{
public:
Derived()
{
echo();
}
virtual void echo()
{
printf("Derived");
}
};
int main()
{
Base* base = new Derived();
base->echo();
return 0;
}
A. DerivedDerivedDerived
B. DerivedBaseDerived
C. BaseDerivedBase
D. BaseDerivedDerived
正确答案:D
题解:
与第九题一样,构造函数内部调用了虚函数,不会有多态性;因此分别打印Base与Derived;然后我们通过父类对象的指针去调用虚函数,虚函数完成重写,达成多态,打印Derived;最后答案D;
四、编程题题解
1、杨辉三角的变形
思路:本题是一个找规律的题目,如果你再往后多些几行,会发现,奇数行都是第二列是偶数,偶数行分为两种情况,第一种是4的倍数,此时第四列是偶数,第二种情况是2的倍数,次数是第三列是偶数;
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
if(n < 3)
cout << -1 << endl;
else if(n % 2== 1)
cout << 2 << endl;
else if((n - 2) % 4 == 0)
cout << 4 << endl;
else
cout << 3 << endl;
return 0;
}
2、计算某字符出现次数
思路:我们首先输入一个字符串,该字符串包括字母、数字和空格;接着我们输入一个字符,我们计算该字符出现在字符串种的次数;如果搜索的是字母则不区分大小写;此时我们有一种思路,在创建一个字符,若原来字符是大写字母,该字符就是对应的小写字母;若原来字符是小写字母,该字符就是对应的大写字母;若非字母,则该字符就是原来字符;然后进行循环判断,该字符的个数;
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
char ch1;
getline(cin, str);
cin >> ch1;
int pos = 0;
int count = 0;
char ch2 = ch1;
if(ch1 >= 'a' && ch1 <= 'z')
ch2 = ch1 - 32;
else if(ch1 >= 'A' && ch1 <= 'Z')
ch2 = ch1 + 32;
while(pos < str.size())
{
if(str[pos] == ch1 || str[pos] == ch2)
count++;
pos++;
}
cout << count << endl;
return 0;
}