• 【C++笔试强训】第九天


    🎇C++笔试强训


    • 博客主页:一起去看日落吗
    • 分享博主的C++刷题日常,大家一起学习
    • 博主的能力有限,出现错误希望大家不吝赐教
    • 分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。

    在这里插入图片描述

    💦 🔥


    选择题

    💦第一题

    某函数申明如下()

    void Func(int &nVal1);
    
    • 1

    有int a,下面使用正确的为:

    A Func(a)
    B Func(&a)
    C Func(*a)
    D Func(&(*a))

    因为是int类型的,所以直接排除CD,所以直接传递int类型的变量就可以了,所以选A

    这道题的答案是A


    💦第二题

    ClassA *pclassa=new ClassA[5];
    delete pclassa;
    
    • 1
    • 2

    C++语言中,类ClassA的构造函数和析构函数的执行次数分别为()

    A 5,1
    B 1,1
    C 5,5
    D 1,5

    这道题考察了new和delete

    请添加图片描述

    这里要开辟5个数据,所以要构造五次,这里的delete pclassa,所以只会调用一次

    但是这道题delete不匹配,有可能会崩溃

    这道题的答案是A


    💦第三题

    动态内存分配(C语言中malloc,C++中的new)得到的存储区属于内存中的:

    A 静态区
    B 堆(heap)
    C 栈(stack)
    D 堆栈
    E 内核内存
    F 不确定

    这道题一眼看过去就是堆,malloc的空间是自己的,肯定是在堆上,new是可以重载的,有可能不在堆上,默认情况是在堆上

    这道题的答案是B


    💦第四题

    下列静态数据成员的特性中,错误的是()

    A 引用静态数据成员时,要在静态数据成员名前加<类名>和作用域符号
    B 说明静态数据成员时前边要加关键字static来修饰
    C 静态数据成员在类体外进行初始化
    D 静态数据成员不是所有对象所共有的

    静态成员变量:所有对象共享的,并不属于具体的某个对象——在类中声明,然后需要在类外单独进行定义,一定不能在构造函数初始化列表的位置初始化——在类外访问静态成员变量时:对象.静态成员变量 || 类名::静态成员变量

    A 选项 —— 类名::静态成员变量
    B 选项 没加static是普通成员变量,加了就是静态成员变量
    C 选项 只能在类外初始化,在程序运行的时候就构造好了
    D 选项 静态成员变量最大的特性是所有对象共享的

    这道题的答案是D


    💦第五题

    用class关键字定义的类,其成员默认的访问属性为()

    A private
    B protected
    C public
    D 无定义

    class类默认的访问属性是私有的 —— private

    这道题的答案是A


    💦第六题

    在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是 ( )。

    A 无操作数的运算符
    B 二元运算符
    C 前缀一元运算符
    D 后缀一元运算符

    一元运算符:该元素只需要一个参数 例如 :-- ++

    每个非静态的成员函数都有一个隐藏的this指针,因为参数表中没有任何参数,所以AB直接排除

    请添加图片描述

    第一个是前置++,第二个是后置++

    这道题的答案是C


    💦第七题

    有如下程序:

    #include
    using namespace std;
    class MyClass{
    public:
    	MyClass(int i=0){cout<<1;}
    	MyClass(const MyClass&x){cout<<2;}
    	MyClass& operator=(const MyClass&x){cout<<3; return*this;}
    	~MyClass(){cout<<4;}
    };
    int main(){
    	MyClass obj1(1),obj2(2),obj3(obj1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行时的输出结果是

    A 121,444
    B 112,444
    C 11,114,444
    D 11,314,445
    E 11,314,444

    obj(1)和obj(2)是直接调用构造函数,obg(obj(1))直接调用拷贝构造,所以这里会打印112,然后就是return 0,然后就会调用析构函数,先创建的后释放,然后会打印444

    这道题的答案是B


    💦第八题

    下面有关c++静态数据成员,说法正确的是()

    A 不能在类内初始化
    B 不能被类的对象调用
    C 不能受private修饰符的作用
    D 可以直接用类名调用

    这道题又是考察静态的数据成员

    静态成员变量:所有对象共享的,并不属于具体的某个对象——在类中声明,然后需要在类外单独进行定义,一定不能在构造函数初始化列表的位置初始化——在类外访问静态成员变量时:对象.静态成员变量 || 类名::静态成员变量

    A const类型可以在类内初始化
    B 打点和类名加作用域访问
    C 可以受private修饰

    这道题的答案是D


    💦第九题

    在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()

    A 将构造函数设为私有
    B 将析构函数设为私有
    C 将构造函数和析构函数均设为私有
    D 没有办法能做到

    请添加图片描述

    如果将构造函数设置为私有的无法实现第二步,所以不行,但是可以将析构函数设置为私有的,如果想要调用析构怎么办呢?

    请添加图片描述

    这道题的答案是B


    💦第十题

    下列的模板声明中,其中几个是正确的()

    1)template
    2)template<T1,T2>
    3)template<class T1,T2>
    4)template<class T1,class T2>
    5)template<typename T1,T2>
    6)template<typename T1,typename T2>
    7)template<class T1,typename T2>
    8)<typename T1,class T2>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    A 2
    B 3
    C 4
    D 5

    这道题是对模版进行考察的

    请添加图片描述

    从图可以得知 1,2,3,5,8是错误的

    4,6,7是正确的

    这道题的答案是B


    编程题

    🔥第一题

    链接:另类加法

    在这里插入图片描述

    • 题目解析

    本题的意思是自己实现加法,不适用现成的运算符,考察大家对于运算符的灵活运用

    • 解题思路:

    本题可以通过位运算实现,具体实现如下:
    两个数求和,其实就是 求和后当前位的数据+两个数求和的进位

    例如:
    1 + 2; 00000001 + 00000010
    求和后当前位的数据: 00000011 ; 求和后的进位数据: 没有进位,则 00000000
    两者相加,则得到: 00000011 就是3
    2 + 2; 00000010 + 00000010
    求和后当前位的数据: 00000000, 1和1进位后当前为变成0了
    求和后进位的数据: 00000100, 两个1求和后进位了
    相加后得到: 00000100 就是4

    求和后当前位的数据:简便的计算方法就是两个数进行异或 00000001 ^ 00000010 -> 00000011
    求和后进位的数据:简便的计算方法就是两个数相与后左移一位 (00000010 & 00000010) << 1
    所以这道题使用递归更加容易理解

    • 代码演示
    class UnusualAdd {
    public:
        int addAB(int A, int B) {
            // write code here
            if(A == 0) 
                return B;
            if(B == 0)
                return A;
            int sum = A ^ B;//不考虑进位时候相加的结构
            int ret = (A&B) << 1;//计算进位的数据
            return addAB(sum, ret);
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    🔥第二题

    链接:走方格的方案数

    在这里插入图片描述

    • 题目解析

    本题为求取路径总数的题目,一般可以通过递归求解,对于复杂的问题,可以通过动态规划求解。此题比较简单,可以通过递归解答。

    • 解题思路

    | 1 | 2 | 3 |

    | 4 | 5 | 6 |

    | 7 | 8 | 9 |

    1. 对于上面的nm(33)的格子,有两种情况
      a. 如果n或者m为1,则只有一行或者一列,从左上角走到右下角的路径数为n + m
      比如: 1 * 1格子,可以先向下走,再向右走,到达右下角;或者先向右走,
      再向下走,到达右下角,共两条,即 1 + 1 = 2,对于1 * m和 n * m的
      情况同学们自己画一下
      b. 如果n,m都大于1,那么走到[n][m]格子的右下角只有两条路径,
      <1>: 从[n - 1][m]格子的右下角向下走,到达
      <2>: 从[n][m - 1]格子的右下角向右走,到达
      所以走到[n][m]格子的右下角的数量为[n-1][m] + [n][m - 1],可以通过递归实现,情况a为递归的终止条件。
    • 代码演示:
    #include 
    using namespace std;
    
    int pathnum(int n,int m)
    {
        if(n == 0 || m == 0)
            return 1;
        return pathnum(n-1,m) + pathnum(n, m-1);
    }
    
    int main()
    {
        int n,m;
        while(cin >> n >> m)
            cout << pathnum(n, m) << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

  • 相关阅读:
    Copy
    SpringSecurity——SG
    VMware使用ubuntu安装增强功能实现自动缩放
    Numpy(三)Numpy的函数与排序
    浏览器安全级别怎么设置,设置浏览器安全级别的方法
    kotlin coroutine源码解析之suspend挂起函数原理
    人工智能时代,掌握未来技术趋势,成为领先者
    What is SVM algorithm
    SpringBoot--token校验登录
    linux中开始mysql中binlog日志
  • 原文地址:https://blog.csdn.net/m0_60338933/article/details/127424185