文章目录
- 一、选择题
- 1-5题
- 6-10题
- 二、编程题
- 题目一
- 题目二
一、选择题
1-5题
A. 不是任何一个函数都可定义成内联函数:这是正确的。因为内联函数需要在编译时展开,如果函数体过大或包含复杂的控制结构(如循环、递归等),那么将其内联可能会导致编译后的代码体积急剧增大,甚至可能超过不内联时的代码体积,从而得不偿失。因此,编译器会忽略某些不适合内联的函数定义。
B. 内联函数的函数体内不能含有复杂的结构控制语句:这也是正确的。如前所述,内联函数应避免包含复杂的控制结构,如循环、递归等,因为这些结构可能导致编译后的代码体积过大。
C. 递归函数可以被用来作为内联函数:这是错误的。递归函数本质上是通过函数调用自身来解决问题的,如果将其定义为内联函数,那么在编译时展开递归调用将会导致无限循环的展开,这显然是不可能的。因此,递归函数不能作为内联函数。
D. 内联函数一般适合于只有1~5行语句的小函数:这是正确的。内联函数最适合用于那些体积小、执行快、调用频繁的函数,以便通过减少函数调用的开销来提高程序的执行效率。
综上选C
D返回值不同是构不成重载的
故D错误选D
a(4)一次、b(5)一次,c[3]三次,共五次
故选A。
A正确
B,默认的拷贝构造函数是浅拷贝
C一个本类对象作为形参(this指针不包括在内,包括this的话那就两个)
D,拷贝构造和复制重载可以同时实现
故选A
A. 赋值运算符只能作为类的成员函数重载
- 这是正确的。赋值运算符
=
必须被重载为类的成员函数,而不能作为友元函数或普通函数来重载。这是因为赋值运算符需要访问类的私有和保护成员,而且赋值操作通常涉及到左侧对象(即调用对象)状态的改变,这要求操作必须是成员函数。
B. 默认的赋值运算符实现了“深层复制”功能
- 这是错误的。默认的赋值运算符(即未显式定义的赋值运算符)实现的是“浅拷贝”(shallow copy)。它仅仅复制了对象的成员变量的值,如果成员变量是指针,那么它复制的是指针的值(即地址),而不是指针所指向的内存区域的内容。这可能导致两个对象共享同一块内存区域,从而引发一系列问题,如双重释放等。
C. 重载的赋值运算符函数有两个本类对象作为形参
- 这是错误的。重载的赋值运算符函数通常只有一个参数,即要赋值给当前对象的对象(通常通过引用传递,以避免不必要的拷贝)。赋值运算符的左侧对象(即调用对象)是隐式传递的,不需要显式作为参数。
D. 如果己经定义了复制拷贝构造函数,就不能重载赋值运算符
- 这是错误的。复制拷贝构造函数(copy constructor)和赋值运算符(assignment operator)是两个独立的功能,分别用于对象的初始化和赋值。你可以同时定义它们,而且通常建议如果定义了其中一个,也应该定义另一个,以保持对象管理的对称性。特别是在涉及到动态内存分配时,确保两者都正确实现“深层复制”是非常重要的。
A:静态数据成员类内声明,类外初始化,C++11之后const类型的整型静态数据成员可以在类内进行初始化。
B:静态数据成员可以被类对象调用
C:受访问控制符的控制
D正确‘故选D
A. 静态数据成员(非const类型)可以在类体内初始化:
这是不正确的。在C++中,静态数据成员(无论是否为const类型)都不能在类体内直接初始化。静态数据成员需要在类体外进行定义和初始化(对于非const和非整型静态数据成员,还需要提供初始值)。对于const整型静态数据成员,可以在类体内使用constexpr进行初始化(C++11及以后)。
B. 静态数据成员不可以被类对象调用:
这是不准确的描述。静态数据成员确实可以通过类名来访问,但同样也可以通过类的对象来访问。不过,通过类对象访问静态成员并不是推荐的做法,因为它会让人误以为这些成员与对象的状态有关,而实际上它们是与类关联的,而不是与类的某个特定对象关联的。
C. 静态数据成员不受private控制符作用:
这是不正确的。静态数据成员(包括静态成员函数)同样受到访问控制符(如private、protected、public)的作用。如果静态数据成员被声明为private,那么它就不能从类的外部被直接访问,包括通过类名访问。但是,类的成员函数(无论静态还是非静态)都可以访问类的private成员,包括静态数据成员。
D. 静态数据成员可以直接用类名调用:
这是正确的。静态数据成员是与类相关联的,而不是与类的任何特定对象相关联的。因此,它们可以通过类名直接访问,而无需创建类的实例。访问静态成员的一般语法是 类名::静态成员名
。如果静态成员在类中被声明为public或protected(并且是在友元类或函数中),则还可以通过类的对象来访问,但这并不是推荐的做法。
6-10题
ad是一个数组指针,指向一个数组,该数组里有三个PAT类型的成员
没new呢,所以不会调用构造函数
故选C。
A:可以提供默认析构函数
B:不是必须用户定义,也可以编译器默认生成
C:正确,析构函数没参数
D:见C
故选C
A. 系统不能提供默认的析构函数:这个说法是不准确的。对于没有显式定义析构函数的类,编译器会自动生成一个默认的析构函数。这个析构函数是空的,但它确实存在。
B. 析构函数必须由用户定义:这也是不准确的。用户可以根据需要定义析构函数来执行清理操作(如释放资源),但如果用户没有定义,编译器会自动生成一个默认的析构函数。
C. 析构函数没有参数:这是正确的。析构函数的定义不允许有任何参数,也不允许有返回类型(除了void,但实际上析构函数不声明返回类型)。这是析构函数的一个基本特性。
D. 析构函数可以设置默认参数:这是错误的。析构函数不能有参数,因此也不能有默认参数。
没啥问题,这里delete this其实就相当于delete a,不过这种写法不推荐,大家可以去自己的编译器上试试,是没问题的。
故选B
选B,基础知识不赘述了
重点是你不显式指定,编译器就会自己推,这里x,y的类型是一样的
B中x会推断成浮点型,y会推断成整型,类型不一致,故B错。
选B。
二、编程题
题目一
题目链接:
最近公共祖先
提交代码:
class LCA {
public:
int getLCA(int a, int b) {
while (a != b) {
if (a > b) {
a /= 2;
} else if (b > a) {
b /= 2;
} else {
return a;
}
}
return a;
}
};
运行结果:
题目二
题目链接:
求最大连续bit数
提交代码:
#include <iostream>
using namespace std;
int main() {
int number;
while(cin>>number){
int count=0,maxcount=0;
while(number){
if(number&1){
++count;
}
else{
maxcount=max(count,maxcount);
count=0;
}
number=number>>1;
}
maxcount=max(count,maxcount);
cout<<maxcount;
}
}
// 64 位输出请用 printf("%lld")
运行结果: