备战秋招 | 笔试强训10

目录

一、选择题

二、编程题

三、选择题题解

四、编程题题解


一、选择题

1、内联函数在以下场景中最有用的()

A. 当函数代码较长且多层嵌套循环的时候

B. 当函数中有较多的静态变量的时候

C. 当函数代码较小并且被频繁调用的时候

D. 以上都不对

2、下列运算符中,在C++语言中不能重载的是:

A. *

B. >=

C. ::

D. delete

3、拷贝构造函数的特点是()

A. 该函数名同类名,也是一种构造函数,该函数返回自身引用

B. 该函数只有一个参数,是对某个对象的引用

C. 每个类都必须有一个拷贝初始化构造函数,如果类中没有说明拷贝构造函数,则编译器系统会自动生成一个缺省拷贝构造函数,作为该类的保护成员

D. 拷贝初始化构造函数的作用是将一个已知对象的数据成员值拷贝给正在创建的另一个同类的对象

4、print()函数是一个类的常成员函数,它无返回值,下列表示中正确的是()

A. const void print();

B. void const print();

C. void print() const;

D. void print(const);

5、不能作为重载函数的调用的依据是:

A. 参数个数

B. 参数类型

C. 函数类型

D. 函数名称

6、如果MyClass为一个类,执行”MyClass a[5], *b[6]”语言会自动调用该类构造函数的次数是()

A. 2

B. 5

C. 4

D. 9

7、下面的程序输出可能是什么?

class Printer
{
    public:
    Printer(std::string name) {std::cout << name;}
};
class Container
{
    public:
    Container() : b("b"), a("a") {}
    Printer a;
    Printer b;
};
int main()
{
    Container c;
    return 0;
}

A. 可能是 "ab" 或 "ba"。 依赖于具体的实现

B. 一直都是 "ba"

C. 一直都是 "ab"

8、在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为()?

A. 0

B. 1

C. 2

D. 4

9、下面 C++ 程序的运行结果是()

#include<iostream>
#include<string>
using namespace std;
class A 
{
    friend long fun(A s) 
    {
        if (s.x < 3) 
        {
        return 1;
        }
        return s.x + fun(A(s.x - 1));
    }
public:
    A(long a) 
    {
        x = a--;
    }
private:
    long x;
};
int main() 
{
    int sum = 0;
    for (int i = 0; i < 5; i++) 
    {
        sum += fun(A(i));
    }
    cout << sum;
    return 0;
}

A. 21

B. 15

C. 9

D. 36

10、以下程序输出是____。

#include <iostream>
using namespace std;
int main(void)
{
    const int a = 10;
    int * p = (int *)(&a);
    *p = 20;
    cout<<"a = "<<a<<", *p = "<<*p<<endl;
    return 0;
}

A. 编译阶段报错运行阶段报错

B. a = 10, *p = 10

C. a = 20, *p = 20

D. a = 10, *p = 20

E. a = 20, *p = 10

二、编程题

1、井字棋  题目链接

2、密码强度等级  题目链接

三、选择题题解

1、内联函数在以下场景中最有用的()

A. 当函数代码较长且多层嵌套循环的时候

B. 当函数中有较多的静态变量的时候

C. 当函数代码较小并且被频繁调用的时候

D. 以上都不对

正确答案:C

题解:

         内联函数的关键字时inline,其作用是建议编译器将该函数作为内联函数,内联函数在编译阶段就在调用出展开,而不会压栈出栈,减少压栈开销,提高效率;内联函数一般是一些代码简短且调用频繁的函数;类内定义的函数一般会默认加上inline关键字;

2、下列运算符中,在C++语言中不能重载的是:

A. *

B. >=

C. ::

D. delete

正确答案:C

题解:

         C++中有如下五个运算符不能进行重载,分别为 .*  ::  :?  sizeof   (点,点星,作用域,三目,大小计算);

3、拷贝构造函数的特点是()

A. 该函数名同类名,也是一种构造函数,该函数返回自身引用

B. 该函数只有一个参数,是对某个对象的引用

C. 每个类都必须有一个拷贝初始化构造函数,如果类中没有说明拷贝构造函数,则编译器系统会自动生成一个缺省拷贝构造函数,作为该类的保护成员

D. 拷贝初始化构造函数的作用是将一个已知对象的数据成员值拷贝给正在创建的另一个同类的对象

正确答案:D

题解:

         A选项,构造函数并没有返回值;B选项,构造函数只有一个参数,该参数必须是同类对象的引用,常常加const修饰;C选项,默认生成的构造函数时类的公有成员;D选项正确;

4、print()函数是一个类的常成员函数,它无返回值,下列表示中正确的是()

A. const void print();

B. void const print();

C. void print() const;

D. void print(const);

正确答案:C

题解:

         类的常成员函数在括号后加const,修饰隐式参数this指针;

5、不能作为重载函数的调用的依据是:

A. 参数个数

B. 参数类型

C. 函数类型

D. 函数名称

正确答案:C

题解:

         函数重载的三要素是,函数名相同,函数的参数类型或参数个数不同;其底层原理是编译阶段,函数名的修饰规则,C选项中的函数类型即返回值类型,与函数重载并无关系;

6、如果MyClass为一个类,执行”MyClass a[5], *b[6]”语言会自动调用该类构造函数的次数是()

A. 2

B. 5

C. 4

D. 9

正确答案:B

题解:

         a对象是一个数组,其中每个元素都是MyClass对象,故调用5次构造,而b是一个数组,其中每个元素类型都是MyClass的指针,不能调用构造,故答案为B;

7、下面的程序输出可能是什么?

class Printer
{
    public:
    Printer(std::string name) {std::cout << name;}
};
class Container
{
    public:
    Container() : b("b"), a("a") {}
    Printer a;
    Printer b;
};
int main()
{
    Container c;
    return 0;
}

A. 可能是 "ab" 或 "ba"。 依赖于具体的实现

B. 一直都是 "ba"

C. 一直都是 "ab"

正确答案:C

题解:

         Container类中,我们发现,我们首先声明了a对象,再声明b对象,而再初始化列表中,看着好像是先初始化b对象,在初始化a对象,实际上,类内成员初始化的顺序只与声明的顺序有关,故先初始化a,再初始化b,选C;

8、在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为()?

A. 0

B. 1

C. 2

D. 4

正确答案:B

题解:

         对于空类来说,其大小为1,这个字节仅仅只是占位作用;故选B;

9、下面 C++ 程序的运行结果是()

#include<iostream>
#include<string>
using namespace std;
class A 
{
    friend long fun(A s) 
    {
        if (s.x < 3) 
        {
        return 1;
        }
        return s.x + fun(A(s.x - 1));
    }
public:
    A(long a) 
    {
        x = a--;
    }
private:
    long x;
};
int main() 
{
    int sum = 0;
    for (int i = 0; i < 5; i++) 
    {
        sum += fun(A(i));
    }
    cout << sum;
    return 0;
}

A. 21

B. 15

C. 9

D. 36

正确答案:B

题解:

         根据题目,我们发现这个循环会循环5次,分别会用0到4构造对象,传入fun函数中,最后将返回值加到sum中,我们可以分别带入其中;如下图所示,答案为B;

10、以下程序输出是____。

#include <iostream>
using namespace std;
int main(void)
{
    const int a = 10;
    int * p = (int *)(&a);
    *p = 20;
    cout<<"a = "<<a<<", *p = "<<*p<<endl;
    return 0;
}

A. 编译阶段报错运行阶段报错

B. a = 10, *p = 10

C. a = 20, *p = 20

D. a = 10, *p = 20

E. a = 20, *p = 10

正确答案:D

题解:

        本题考察对C++中const修饰的对象的理解,在C++中,const修饰的对象其实已经不是普通对象了,而是一个常量,类似于#define定义的常量,在编译阶段,会对常量所在的地方进行替换;接着我们看代码,a是一个const修饰的整型常量,p中存放的是a的地址,注意这里&a取出来的数据类型是 const int* ,我们对齐进行强制类型转换成 int*,所以接着我们通过p指针修改a中内容不会报错;当我们打印a时,实际上在编译阶段就进行了替换,因此输出10,而通过p打印其内容时,由于内容被我们改变了,因此打印20;故选D;

四、编程题题解

1、井字棋

思路:注意题目的井字棋棋盘不一定是3×3的棋盘,题目中认定我们是棋盘为1的棋子,因此有如下四种情况;情况一,我们可以通过将每一行的数字加起来,若等于列的数量,说明我们获胜;情况二,我们可以通过将每一列的数字加起来,若等于行的数量,说明我们获胜;情况三,我们可以通过将从左上角到右下角每个棋盘元素加起来,若等于行的数量,说明我们获胜;情况四,我们可以将右上角到左下角每个棋盘元素加起来,若等于行的数量,说明我们获胜;其他情况属于输;

class Board 
{
public:

    bool checkWon(vector<vector<int> > board) 
    {
        int row = board.size();
        int col = board[0].size();
        // 检查是否有因行数获胜
        for(int i = 0; i < row; i++)
        {
            int sum = 0;
            for(int j = 0; j < col; j++)
            {
                sum += board[i][j];
            }
            if(sum == col)
                return true;
        }
        // 检查列数是否相等
        for(int i = 0; i < col; i++)
        {
            int sum = 0;
            for(int j = 0; j < row; j++)
            {
                sum += board[i][j];
            }
            if(sum == row)
                return true;
        }
        // 检查正斜线
        int sum = 0;
        for(int i = 0; i < col; i++)
        {
            sum += board[i][i];
        }
        if(sum == col)
            return true;
        // 检查反斜线
        sum = 0;
        for(int i = 0; i < row; i++)
        {
            sum += board[i][col - i - 1];
        }
        if(sum == col)
            return true;
        // 以上都不成立,返回false
        return false;
    }
};

2、密码强度等级

思路:该题纯属考察条件判断的使用,并无什么算法,代码如下;

#include <iostream>
using namespace std;

int main() 
{
    int grade = 0;
    string str;
    cin >> str;
    // 统计密码中大写字母。小写字母。数字,符号个数
    int nums = 0;
    int cap_letter = 0;
    int low_letter = 0;
    int signal = 0;
    for(auto& e : str)
    {
        if(e >= '0' && e <= '9')
            nums++;
        else if(e >= 'A' && e <= 'Z')
            cap_letter++;
        else if(e >= 'a' && e <= 'z')
            low_letter++;
        else 
            signal++;
    }

    // 密码长度
    if(str.size() <= 4)
        grade += 5;
    else if(str.size() >= 5 && str.size() <= 7)
        grade += 10;
    else
        grade += 25;

    // 字母
    int sum_letter = cap_letter + low_letter;
    if((cap_letter == 0 && low_letter != 0) || (low_letter == 0 && cap_letter != 0))
        grade += 10;
    else if(cap_letter && low_letter)
        grade += 20;

    // 数字
    if(nums == 1)
        grade += 10;
    else if(nums > 1)
        grade += 20;
    
    // 符号
    if(signal == 1)
        grade += 10;
    else if(signal > 1)
        grade += 25;

    // 奖励
    if(cap_letter && nums && signal)
        grade += 5;
    else if(sum_letter && nums && signal)
        grade += 3;
    else if(sum_letter && nums)
        grade += 2;

    // 安全评定
    if(grade >= 90)
        cout << "VERY_SECURE" << endl;
    else if(grade >= 80)
        cout << "SECURE" << endl;
    else if(grade >= 70)
        cout << "VERY_STRONG" << endl;
    else if(grade >= 60)
        cout << "STRONG" << endl;
    else if(grade >= 50)
        cout << "AVERAGE" << endl;
    else if(grade >= 25)
        cout << "WEAK" << endl;
    else if(grade >= 0)
        cout << "VERY_WEAK" << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值