笔试强训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;

 

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

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

正确答案:B

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

class A
{
    public:
        A(){}
        ~A();
};

A::~A()
{}

 

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

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

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

 
简单:

class BinInsert {
public:
int binInsert(int n, int m, int j, int i) {
m <<= j;
return n | m;
}
};

 
 

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

链接

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

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

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

示例
2:
输入
4


2
2

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

正确答案:

#include <iostream>
#include<cmath>
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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hey pear!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值