文章目录
一. 单选
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指针,也不会受访问限定符的限制
- 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;
}