备战秋招 | 笔试强训17

目录

一、选择题

二、编程题

三、选择题题解

四、编程题题解


一、选择题

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;
}

猜你喜欢

转载自blog.csdn.net/Nice_W/article/details/131981672