🎇C++笔试强训
- 博客主页:一起去看日落吗
- 分享博主的C++刷题日常,大家一起学习
博主的能力有限,出现错误希望大家不吝赐教
- 分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。
💦 🔥
选择题
💦第一题
某函数申明如下()
void Func(int &nVal1);
有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;
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<iostream>
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;
}
运行时的输出结果是
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>
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 |
- 对于上面的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 <iostream>
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;
}