开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
每天进步一点点,我们就能遇见更好的自己一起来打卡加油!
我们都会在各自喜欢的事情里,变得可爱!
提示:以下是本篇文章正文内容,下面案例可供参考
一、选择题
1、下面程序段包含4个函数,其中具有隐含this指针的是()
int f1();
classT{
public:static int f2();
private:friend int f3();
protect:intf4();
A、f1
B、f3
C、f2
D、f4
答案:D。分析:
1、静态变量没有this指针
2、友元函数没有this指针
3、类外面的变量没有this指针
4、类里面的普通成员函数有指针
所以,f1, f2, f3都没有this指针。
2、 C++中关于堆和栈的说法,哪个是错误的()
A、堆的大小仅受操作系统的限制,栈的大小一般较小
B、堆和栈都可以静态分配
C、在堆上频繁的调用new/aelete容易产生内存碎片,栈没有这个问题
D、堆和栈都可以动态分配
答案:B。分析:
栈和堆都能动态分配地址,但是堆没有静态的堆
3、关于虚函数的描述正确的是()
A、派生类必须重新定义基类的虚函数
B、派生类的虚函数与基类的虚函数具有不同的参数个数和类型
C、内联函数不能是虚函数
D、虚函数可以是一个static型的函数
答案:A。分析:派生类必须重新定义基类的虚函数,完成重写才能调用。 虚函数不可以是一个static函数。
4、C++将父类的析构函数定义为虚函数,下列正确的是哪个()
A、这样做是错误的
B、释放父类指针时能正确释放子类对象
C、释放子类指针时能正确释放父类对象
D、以上全错
答案:D。分析: 在释放父类指针时,如果父类指针指向了一个子类对象,那么可以调用子类的析构继而调用父类的析构,删除这个对象,防止内存泄漏问题。
5、 当一个类对象的生命周期结束后,关于调用析构函数的描述正确的是:()
A.如果派生类没有定义析构函数,则只调用基类的析构函数
B.如果基类没有定义析构函数,则只调用派生类的析构函数
C.先调用派生类的析构函数,后调用基类的析构函数
D.先调用基类的析构函数,后调用派生类的析构函数
答案:C。分析:析构过程和构造相反, 先调用派生类的析构函数,后调用基类的析构函数。
6、下面叙述不正确的是(D)
A派生类一般都用公有派生
B对基类成员的访问必须是无二义性的
C赋值兼容规则也适用于多重继承的组合
D父类的公有成员在派生类中仍然是公有的
答案:选D。分析:子类通过公有继承,父类的公有成员在派生类中仍然是公有的,但是如果是私有继承,父类的公有成员在派生类中算私有的。
7、以下关于纯虚函数的说法,正确的是()
A、子类必须实现基类的
B、声明纯虚函数的类不能实例化
C、声明纯虚函数的类成虚基类
D、纯虚函数必须是空函数
答案: B。分析:B答案:抽象类不能声明对象,只是作为基类为派生类服务。
8、下列关于多态性说法不正确的是()
A、重载方式包含函数重载和运算符重载
B、多态性是指同名函数对应多种不同的实现
C、重载方式仅有函数重载
D、多态性表现为静态和动态两种方式
答案 C。分析:重载方式不仅有函数重载,运算符重载,但是运算符重载严格也是算函数重载。 9、下列哪种函数可以定义为虚函数()
A、析构函数
B、内联成员函数
C、静态成员函数
D、构造函数
答案: A。 分析:析构函数是可以被定义为虚函数。
10、现有一循环队列,其队头指针为front,队尾指针为rear,循环队列长度 为N,最多存储N-1个数据。其队内有效长度为()
A.(rear-front + N)% N+1
B.(rear-front +N)% N
C.(rear-front)%(N+1)
D.(rear-front+N)%(N-1)
答案: B。分析:有效长度一般是rear-front,但是循环队列中rear有可能小于front,所以需要+N,最大长度为N,所以有效长度不可能超过N,故需要%N。
二、编程题
1、参数解析
题目分析:首先是这题读入有空格,需要用getline解析出来的每一个参数用vector存。
代码分析:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string str;
while (getline(cin, str)) {
bool flag = false;
vector<string> vec;
string row;
for (int i = 0; i < str.size(); i++) {
if (flag) {//在括号内
if (str[i] != '"') row += str[i];
else flag = false;
} else {
if (str[i] == ' ') {
vec.push_back(row);
row = "";
} else if (str[i] == '"') flag = true;
else row += str[i];
}
}
vec.push_back(row);
cout << vec.size() << endl;
for (auto i : vec) cout << i << endl;
}
return 0;
}
2、跳石板
贪心解法
#include <iostream>
#include <vector>
#include <climits>
#include <cmath>
#include <algorithm>
using namespace std;
int main(){
int N,M;
while(cin>>N>>M){
vector<int> steps(M+1,INT_MAX);
steps[N] = 0;
for(int i=N;i<=M;i++){
if(steps[i] == INT_MAX){
continue;
}
for(int j=2;(j*j)<=i;j++){
if(i%j == 0){
if(i+j <= M){
steps[i+j] = min(steps[i]+1,steps[i+j]);
}
if(i+(i/j) <= M){
steps[i+(i/j)] = min(steps[i]+1,steps[i+(i/j)]);
}
}
}
}
if(steps[M] == INT_MAX){
steps[M] = -1;
}
cout<<steps[M]<<endl;
}
return 0;
}
动态规划解法:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<int> v[N];
int f[N];
int n,m;
int main()
{
cin>>n>>m;
memset(f,0x3f,sizeof f);
for(int i=n;i<=m;i++)
for(int j=2;j<=i/j;j++)
if(i%j==0)
{
v[i].push_back(j);
if(i/j!=i) v[i].push_back(i/j);
}
f[n]=0;
for(int i=n;i<=m;i++)
for(auto x:v[i])
if(i+x<=m) f[i+x]=min(f[i+x],f[i]+1);
if(f[m]!=0x3f3f3f3f) cout<<f[m];
else cout<<-1;
return 0;
}
总结
本文总共讲了10题有关多态的选择题,以及两道牛客编程题,希望大家读后能够有所收获!