48天笔试强训——第13天

95 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情


选择题

image.png

公有继承才能使用基类的公有成员,所以派生类一般都是公有派生 基类成员的访问必须是无二义性的,出现二义性就会出现各种问题 在继承中派生类可以赋值给基类,在这里的赋值是切片操作 当时私有继承的时候,父类的公有的成员在派生类中也是私有的。 所以选D

image.png

这道题没有什么陷阱,认真读代码就可以选出来。

image.png 本人觉得该道题目有点小问题

在构成多态的时候,派生类的虚函数和基类的虚函数具有相同的参数类型和个数。 构成多态的条件:1,虚函数的重写,2,父类对象或引用调用虚函数 内联函数可以不可以做虚函数呢?有两个说法,分别就是可以和不可以其实。我觉得是不可以的,虽然加上virtual 是没有用的,为什么这么说呢———内联函数在编译的时候会直接展开,而虚函数会放入虚函数表中,虚函数表存的是该函数的地址,是在运行的时候去该表中找函数的地址,有函数栈帧的开辟。这样不就是矛盾了嘛。当然也可以说是可以的,因为vircult 只是建议。 派生类不一定要重写基类的虚函数,又没有规定非要重新实现 虚函数是不可以是静态函数类型的,因为虚函数需要去找虚函数表,而静态类型是是没有this 指针,所以就吗,有办法去找虚函数表。

image.png

构造函数调用的顺序,先调用基类的构造函数,再调用派生类的构造函数。 析构的顺序:先调用派生类的析构函数,再调用基类的构造函数,即使派生类,或者基类没有定义析构函数,但是要记住他们都有默认的析构函数哦。

image.png

什么是纯虚函数:首先是虚函数,然后再后面加上一个=0 ,那么该函数就是纯虚函数。 含有纯虚函数的类为抽象类,抽象类不能实例化出来对象,纯虚函数不一定是空函数,他的函数体中可以有东西, 子类不一定要去实现基类的虚函数。

image.png

对于1,const 修饰的是*p 也就是说p的值是可以改变的,p指向的内容不能改变。 对于2,p是指针,在64位机器上,指针的大小都是8. inline 会检查函数的参数,其调用开销和宏差不多 重载是编译是决议的,虚函数是运行的时候绑定。

image.png

把父类的析构函数定义成虚函数,主要是为了当父类的指针指向子类的对象的时候,可以正确释放该指针指向的子类对象。

image.png

A的说法正确,重载不仅仅有函数重载,还有运算的重载 多态性表现为静态和动态两种方式,静态的多态是编译时决议的,动态行多态运行时决议的

image.png

调用Play 的时候5传给b,调用相应的构造函数,打印constructed by parameter5 ,返回b的时候由于编译器的优化,会直接返回该temp 调用的拷贝构造,然后析构b,再析构temp。

image.png

对于1,对象调用还是调用自己对象的成员,2构成多态,调用指针真实指向的对象,3,都是对象a的调用。 image.png

编程题

参数解析

对于这一个字符串,我们要查找到空格和",找到它们之后我们要判断它们之间的相对位置,如果空格在"前面那么空格前面的就是一个参数解析,当"在空格的前面的时候,此空格并不是参数解析的分割的标志,所以我们要继续找到下一个"这两个"之间的为参数解析。我们用find函数进行查找。

跳石板

对于本题,我们要找走的步数最小的。我们把不可以走到的位置设为-1,表示不能走到,我们从起始位置开始走,开始的时候还没有走我们认为步数为0,然后走它的约数步,那么走到该位置的所需要的步数等于起始的步数加1,同时还要和自己当前的步数比较,如果不是-1,那么就要和起始的步数加一进行比较,选择小的那个(最优),如果等于-1,那么就是起始步数加1。依次遍历即可。遍历的时候发现该位置不能走(-1),就要跳过。

#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
void f(int n,vector<int>& d)
{
    for(int i=2;i<=sqrt(n);++i)
    {
        if(n%i==0)
        {
            d.push_back(i);
            if(n/i!=i)
            {
                d.push_back(n/i);
            }
        }
    }
}
int main() {
    int n, m;
    cin >> n >> m;
    vector<int> step(m + 1, -1);
    step[n] = 0;
    for (int i = n; i < m; ++i) {
        
        if(step[i]!=-1)
        {
            vector<int> d;
            f(i,d);
            int a=0;
            while(a<d.size())
            {
                if(i+d[a]<=m)
                step[i+d[a]]=step[i+d[a]]==-1||step[i+d[a]]>step[i]+1?step[i]+1:step[i+d[a]];
                ++a;
            }
        }
        else
        {
            continue;
        }

    }
    cout<<step[m]<<endl;
    return 0;
}