• 笔试强训48天——day12


    一. 单选

    1. 引用和指针,下面说法不正确的是()

    A 引用和指针在声明后都有自己的内存空间
    B 引用必须在声明时初始化,而指针不用
    C 引用声明后,引用的对象不可改变,对象的值可以改变,非const指针可以随时改变指向的对象以及对象的值
    D 空值NULL不能引用,而指针可以指向NULL

    正确答案:A

    引用:是一个别名,与其引用的实体公用一份内存空间,编译器不会给引用变量重新开辟新的内存空间

    int a = 10;
    int& ra = a;
    ra = 100;
    const int& rc = a;
    rc = 200;//编译失败
    
    int* pa;
    int* pb = &a;
    int* pc = NULL;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

     

    2. 下列哪一个是析构函数的特征()

    A 析构函数定义只能在类体内
    B 一个类中只能定义一个析构函数
    C 析构函数名与类名不同
    D 析构函数可以有一个或多个参数

    正确答案:B

    析构函数:无返回值也没有参数,可以在类外或类内定义
    类内声明+类外定义(记得+类域)

    class A
    {
        public:
            A(){}
            ~A();
    };
    
    A::~A()
    {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

     

    3. 若要对data类中重载的加法运算符成员函数进行声明,下列选项中正确的是?

    A Data operator+(Data);
    B Data operator(Data);
    C operator+(Data,Data);
    D Data+(Data);

    正确答案:A

    只需给一个参数,因为有一个隐藏的this指针
    重载关键字+运算符:operator+

     

    4.若MyClass是一个类名,其有如下语句序列:

    MyClass c1,*c2;
    MyClass *c3=new MyClass;
    MyClass &c4=c1;
    上面的语句序列调用构造函数个数是( )。
    A 1
    B 2
    C 3

    正确答案:B

    c1 new Myclass = 2
    指针和引用没创建新对象不占用空间

     

    5. 下面关于类和对象的描述中,错误的是:

    A 类就是C语言中的结构体类型,对象就是C语言中的结构体变量
    B 类和对象之间的关系是抽象和具体的关系
    C 对象是类的实例,一个对象必须属于一个已知的类
    D 类是具有共同行为的若干对象的统一描述体

    正确答案:A

    类是用来描述对象的,描述对象有哪些属性,有哪些方法
    对象是类的具体体现
    例如:
    student类:表示学生这个群体——是对学生这个群体进行描述
    张三同学、李四同学是一个学生实体,或者也称为学生对象
    抽象:对一个事物的认知过程

     

    6. 下列关于类和对象的叙述中,错误的是()

    A 一个类只能有一个对象
    B 对象是类的具体实例
    C 类是对某一类对象的抽象
    D 类和对象的关系是一种数据类型与变量的关系

    正确答案:A

    单例模式:一个类只能创建一个对象

     

    7.如果有一个类是 myClass , 关于下面代码正确描述的是:

    myClass::~myClass(){
    delete this;
    this = NULL;
    } 
    
    • 1
    • 2
    • 3
    • 4

    A 正确,我们避免了内存泄漏
    B 它会导致栈溢出
    C 无法编译通过
    D 这是不正确的,它没有释放任何成员变量。
    正确答案:C

    1.不能在析构函数中直接调用delete this。可以通过编译,但是代码运行时一定会崩溃,会形成无限递归——程序运行时栈溢出导致程序奔溃
    原因:
    调用析构函数释放对象中的资源
    调用operator delete§释放对象的空间

    2.析构函数作用:对象销毁时,释放对象中的资源
    问题:并不是所有的对象都是从堆上new出来的
    this = NULL;//编译失败
    this类型是类类型* cons this
    this指针的指向不能被修改

     

    8. 请问以下说法,哪个是正确的:

    A 每个类都有一个无参数的构造函数。
    B 每个类都有一个拷贝构造的函数。
    C 每个类能有多个构造函数。
    D 每个类能有多个析构函数。

    正确答案:C

    在类中,如果用户没有显示定义任何构造函数,则编译器会生成一个无参的构造函数,但是用户一旦定义,则编译器不再生成。
    拷贝构造函数:如果用户没有显示定义,编译器将会生成一份默认的拷贝构造函数;
    一旦用户显示定义,则编译器不再生成。
    但有些类不需要拷贝构造函数。
    析构函数只能有一个

     

    9.下面程序段包含4个函数,其中具有隐含this指针的是()

    int f1();//不是成员函数
    class T
    {
    public:static int f2();
    private:friend int f3();
    protect:int f4();
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    A f1
    B f2
    C f3
    D f4
    正确答案:D

    类中非静态成员函数中都有一个隐藏的this指针
    友元函数不是类的成员函数——没有this指针,也不会受访问限定符的限制

     

    1. C++中关于堆和栈的说法,哪个是错误的()
      A 堆的大小仅受操作系统的限制,栈的大小一般较小
      B 在堆上频繁的调用new/delete容易产生内存碎片,栈没有这个问题
      C 堆和栈都可以静态分配
      D 堆和栈都可以动态分配
      正确答案:C

    静态分配:程序在编译的时候就知道需要占用多大的内存空间
    动态分配:在运行时才知道需要占用多大的内存空间
    堆上都是动态分配,栈上既可以动态分配也可以静态分配——在函数体中创建了一个数组

     
     

    二. 编程

    1.二进制插入

    链接

    给定两个32位整数n和m,同时给定i和j,将m的二进制数位插入到n的二进制的第j到第i位,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j+1,其中二进制的位数从0开始由低到高。

    测试样例:
    1024,19,2,6
    返回:1100

    思路:
    n 10000001
    m 1101
    i = 5
    j = 2
    要把n的二进制值插入m的第j位到第i位,只需要把n先左移j位,然
    后再进行或运算(|)即可

    正确答案:
    有点复杂:

    class BinInsert {
    public:
        int binInsert(int n, int m, int j, int i) {
            // write code here
            for (int k = 0;k<=i-j;k++)
            {
                n |= ((m>>k)&1)<<(j+k);        
            }
            return n;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

     
    简单:

    class BinInsert {
    public:
    int binInsert(int n, int m, int j, int i) {
    m <<= j;
    return n | m;
    }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

     
     

    2. 查找组成一个偶数最接近的两个素数

    链接

    任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指
    定偶数的两个素数差值最小的素数对。

    数据范围:输入的数据满足
    输入描述:
    输入一个大于2的偶数
    输出描述:
    从小到大输出两个素数

    示例1:
    输入
    20
    输出
    7
    1
    3

    示例
    2:
    输入
    4


    2
    2

    思路:
    找到注册一个偶数的两个素数
    两个素数相加的和就是指定的偶数
    素数:只能被1和自己整除的数字

    正确答案:

    #include 
    #include
    using namespace std;
    
    bool Is_prime(int n)
    {
        for(int i = 2;i<= sqrt(n);i++)
        {
            if(n%i == 0)
            return false;
    
           
        }
     return true;
    }
    
    int main() {
        int n;
        while(cin>>n){
            for(int i = n/2;i>=0;i--)
            {
                if(Is_prime(i) && Is_prime(n-i))
                {
                    cout<<i<<endl;
                    cout<<n-i<<endl;
                    break;
                }
            }
    
    
        }
       
       return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    2022国赛正式题nfs 解题
    星际争霸之小霸王之小蜜蜂(十三)--接着奏乐接着舞
    cms之wordpress主题安装
    centos7配置
    JVM 运行期优化 & 反射优化
    来n遍剑指--04. 二维数组中的查找
    关于一个left join的易错点
    Spring 之 jwt,过滤器,拦截器,aop,监听器
    前微软CEO的“离别礼物“:Cortana差点改名为“Bingo”
    javascript的数组对象常用方法
  • 原文地址:https://blog.csdn.net/Ll_R_lL/article/details/127570259