C++笔试强训11


一、选择题

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")

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

争不过朝夕,又念着往昔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值