🎇C++笔试强训
- 博客主页:一起去看日落吗
- 分享博主的C++刷题日常,大家一起学习
博主的能力有限,出现错误希望大家不吝赐教
- 分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。
💦 🔥
选择题
💦第一题
关于内联函数说法错误的是()
A 不是任何一个函数都可定义成内联函数
B 内联函数的函数体内不能含有复杂的结构控制语句
C 递归函数可以被用来作为内联函数
D 内联函数一般适合于只有1~5行语句的小函数
关于内联函数我们提过很多次了
A 内联函数是有要求的,所以A正确
B 内联函数不可以太复杂,B正确
C 递归不可以做内联
D 内联函数建议不要太长,C++官方文档建议1-5行
这道题的答案是C
💦第二题
以下不是double compare(int,int)的重载函数的是()
A int compare(double,double)
B double compare(double,double)
C double compare(double,int)
D int compare(int,int)
关于函数重载,函数名要一样,参数列表要求不一样,和返回值类型没有关系
这道题答案是D
💦第三题
假定有类AB,有相应的构造函数定义,能正确执行
AB a(4),b(5),c[3],*p[2]={&a,&b};
语句,请问执行完此语句后共调用该类的构造函数次数为___
A 5
B 4
C 3
D 9
创建ab各调用一次,创建数组c包含3个对象调用3次,p是个指针数组,存放的是指针,所以p不会调用构造函数
这道题的答案是A
💦第四题
下列关于赋值运算符“=”重载的叙述中,正确的是
A 赋值运算符只能作为类的成员函数重载
B 默认的赋值运算符实现了“深层复制”功能
C 重载的赋值运算符函数有两个本类对象作为形参
D 如果己经定义了复制拷贝构造函数,就不能重载赋值运算符
如果用户在类中没有显示定义赋值运算符重载时,编译器自动生成一份——按照浅拷贝方式实现的
A 赋值运算符重载如果重载成普通的成员函数编译器会报错,编译无法通过
B 默认的赋值运算符是编译器自动生成的,按照浅拷贝实现,错误
C 赋值运算符重载只可以放一个类型,前面有一个隐藏的this,错误
D 拷贝构造和重载赋值运算符是两个函数,不冲突,错误
这道题的答案是A
💦第五题
下列有关静态成员函数的描述中,正确的是:
A 静态数据成员(非const类型)可以在类体内初始化
B 静态数据成员不可以被类对象调用
C 静态数据成员不受private控制符作用
D 静态数据成员可以直接用类名调用
A 静态成员是所有类共享的,所以就不可以在类内初始化
B 可以通过类名+作用域的方式访问
C 静态成员如果是类的成员都要受控制符访问
D 静态数据成员可以直接用类名调用,一般更推荐类名+作用域访问
这道题的答案是D
💦第六题
若PAT是一个类,则程序运行时,语句“PAT(*ad)[3];”调用PAT的构造函数的次数是()
A 2
B 3
C 0
D 1
ad是一个数组指针,是一个指针,该指针将来只能指向PAT类型的3个连续的空间,没有创建对象,所以不会调用构造函数
这道题的答案是C
💦第七题
下面对析构函数的正确描述是()
A 系统不能提供默认的析构函数
B 析构函数必须由用户定义
C 析构函数没有参数
D 析构函数可以设置默认参数
A 系统会提供默认析构
B 析构函数可以由系统提供默认的
C 析构函数没有参数,如果有参数编译器会报错,(所以析构函数不能重载)
D 析构函数没有参数,无法设置默认值
这道题的答案是C
💦第八题
关于以下代码,哪个说法是正确的()
myClass::foo(){
delete this;
}
..
void func(){
myClass *a = new myClass();
a->foo();
}
A 它会引起栈溢出
B 都不正确
C 它不能编译
D 它会引起段错误
delete this 代表把当前对象销毁掉
func里面为a new新空间,然后用a指向foo,然后将a对象销毁掉,所以代码没有任何问题
这道题的答案是B
💦第九题
哪种说法是错误的()?
A 构造函数可以有形参
B 析构函数可以有形参
C 构造函数无任何函数类型
D 析构函数无任何函数类型
A 构造函数可以有形参,在类中可能有多个成员变量
B 析构函数没有参数
CD 析构函数和构造函数无任何参数类型
这道题的答案是B
💦第十题
有如下模板定义:
template <class T>
T fun(T x,T y){
return x*x+y*y;
}
在下列对fun的调用中,错误的是()
A fun(1, 2)
B fun(1.0, 2)
C fun(2.0, 1.0)
D fun(1, 2.0)
fun在实例化时,其传递的两个参数的类型必须要一致,如果不一致的话需要显示实例化
这道题的答案是B
编程题
🔥第一题
链接:最近的公共祖先
- 题目解析
最近公共祖先表示距离两个节点最近的公共父节点,这道题考察二叉树。
- 解题思路
题目所描述的满二叉树如下: 1 / \ 2 3 / \ / \ 4 5 6 7 上述树中子节点与父节点之间的关系为root = child / 2所以如果a != b,就让其中的较大数除以2, 如此循环直到a == b 即是原来两个数的最近公共祖先 比如: 2和7的最近公共祖先:7/2 = 3 —> 3/2 = 1, 2/2 = 1, 得到1为它们的公共祖先
- 代码演示:
class LCA {
public:
int getLCA(int a, int b) {
// write code here
while(a != b)
{
if(a > b)
a /= 2;
else
b /= 2;
}
return b;
}
};
🔥第二题
链接:求最大连续bit数
- 题目解析
这道题考察位运算
- 解题思路
根据位运算,获取每一位的二进制值。获取第i位的值: (n >> i) & 1。如果1连续,则计数累加,如果不连续,则从0开始计数。
- 代码演示:
#include <iostream>
using namespace std;
int main() {
int n;
while (cin >> n) {
int count = 0, maxcount = 0;
//如果测试用例是-1时无法通过,以为右移动会补符号位
// while (n) {
// if (n & 1) {
// count++;
// maxcount = max(count, maxcount);
// } else {
// count = 0;
// }
// n = n >> 1;
// }
//此时的解决方法是将1往左移,不改变n
for(int i = 0;i < 32;i++)
{
if(n &(1 << i))
{
count++;
maxcount = max(count,maxcount);
}
else
count = 0;
}
cout << maxcount << endl;
}
return 0;
}