C++笔试强训9


一、选择题

1-5题

在这里插入图片描述

函数形参是个int类型的引用,传参的时候直接传一个int类型的变量就行
故选A


在这里插入图片描述
1.malloc/calloc/realloc—>free
2. new / delete
3. new[] / delete[]
一定要匹配起来使用,否则程序可能会产生内存泄漏或者程序可能会崩溃

new T 底层过程
1.先调用operator new(size)申请空间
2.然后调用T的构造函数对申请的空间进行初始化
delete p 底层过程
1.先调用析构函数释放p指向对象中的资源
2.然后调用operator delete释放p所指向的空间

注意: new只能申请单个元素的空间 delete只能释放单个元素的空间

new T[N] 底层过程
1.调用operator new申请空间
—>operator new(size)
2.调用N次T的构造函数
delete[] p 底层过程
1.调用N次析构函数释放p指向的N个对象
2.调用operator delete释放空间
—>operator delete(p

本题中就是没有配对使用导致的问题,new class A[5]会调用5次构造函数,但在释放的时候应该使用delete[] pclassa才对,这里使用的是delete pclassa会导致未定义行为,题目不太严谨,此处应该给出出现未定义行为才对,不过如果非要选一个的话,那就是析构了一次,因为delete只能释放单个元素的空间

故选A


在这里插入图片描述
malloc和new出来的内存在堆heap上,常识不多解释。
如果对这块只是不太了解,可以点击下面的超链接,去看一看我写的另一篇文章。
C&C++内存管理

故选B


在这里插入图片描述
静态数据成员的特性

  1. 所有对象共享:类的所有对象共享同一个静态数据成员,因此,通过任何对象所做的修改都会影响所有对象。

  2. 访问:静态数据成员可以通过类名和作用域解析运算符(::)来访问,也可以通过类的对象来访问,但后者通常不推荐,因为它可能会误导读者认为该成员是非静态的。

  3. 初始化:静态数据成员必须在类外部定义和初始化(除非它们是const整型或枚举类型,并且使用C++11或更高版本的初始化器列表在类内初始化)。

  4. 存储位置:静态数据成员存储在全局数据区,而不是在类的任何特定对象内。

  5. 生命周期:静态数据成员的生命周期与程序相同,从程序启动到程序结束。

  6. 默认访问级别:如果静态数据成员没有在类定义中指定访问修饰符(如publicprotectedprivate),则它们默认为private。但是,由于它们通常需要在类外部访问和修改,因此通常将它们声明为public

故选D


在这里插入图片描述

C++中类class的默认访问权限是private,结构体struct中默认是public
补充一下,在C++中结构体struct也被封装成了类,和class的区别就是默认访问权限不同。

故选A。


6-10题

在这里插入图片描述
参数表没有任何参数表名只有一个隐含的this指针,说明是个一元运算符,例如++、–这种
为了区分前后置++,会在后置++的参数表中加一个int参数,此处没参数,说明是前置一元运算符
Date& operator++()前置++
Date operator++(int)后置++

故选C


在这里插入图片描述
调用构造函数输出1,调用拷贝构造输出2,调用复制重载输出3,调用析构函数输出4.
然后重点看下图,第一个obj1(1)和第二个obj2(2)都是调用的单参数构造函数,输出俩1,第三个obj3(obj1)调用的拷贝构造,输出一个2,最后三个都析构,输出三个4

故选112,444
故选B
在这里插入图片描述


在这里插入图片描述
C++中的静态数据成员是类的成员,但它不是类的任何特定对象的实例的一部分。静态数据成员在类的所有对象之间共享,即类的所有对象都访问同一个静态成员变量。静态数据成员在程序开始时分配内存,并在程序结束时销毁。

静态数据成员的特性

  1. 所有对象共享:类的所有对象共享同一个静态数据成员,因此,通过任何对象所做的修改都会影响所有对象。

  2. 访问:静态数据成员可以通过类名和作用域解析运算符(::)来访问,也可以通过类的对象来访问,但后者通常不推荐,因为它可能会误导读者认为该成员是非静态的。

  3. 初始化:静态数据成员必须在类外部定义和初始化(除非它们是const整型或枚举类型,并且使用C++11或更高版本的初始化器列表在类内初始化)。

  4. 存储位置:静态数据成员存储在全局数据区,而不是在类的任何特定对象内。

  5. 生命周期:静态数据成员的生命周期与程序相同,从程序启动到程序结束。

  6. 默认访问级别:如果静态数据成员没有在类定义中指定访问修饰符(如publicprotectedprivate),则它们默认为private。但是,由于它们通常需要在类外部访问和修改,因此通常将它们声明为public

综上,故选D。


在这里插入图片描述
A:将构造函数设为私有,new都创建不了,因为new一个对象的时候会调用该对象的构造函数,现在构造函数私有的,就不能创建了,故A错
C:和A同理,也错

B:把析构函数设置为私有的,new的时候肯定没问题了,但是delete却无法调用析构函数了,可以在类里写个公有成员函数,比如close,在这里面进行delete操作就好。

void release(A* a)
{
	delete a;
}

故B可以,选B
在这里插入图片描述


在这里插入图片描述
template<class T>
template<typename T>
class和typename都可以

467是对的,共三个
故选B


二、编程题

题目一

题目链接:

另类加法
在这里插入图片描述

提交代码:

class UnusualAdd {
  public:
    int addAB(int A, int B) {
        if (A == 0) return B;
        if (B == 0) return A;
        int a = A ^ B;//求和后当前位的数据
        int b = (A & B) << 1;//求和后进位的数据
        return addAB(a, b);//递归两个数进行相加,任意为0时截止
    }
};

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


题目二

题目链接:
走方格的方案数

在这里插入图片描述

提交代码:

#include <iostream>
#include<vector>
using namespace std;

int main() {
    int m, n;
    cin >> n >> m;
    vector<vector<int>> arr(n + 2, vector<int>(m + 2, 0));
    if (n == 1 || m == 1) {
        cout << m + n;
        return 0;
    }
    arr[0][2] = 1;
    arr[2][0] = 1;
    for (int i = 1; i < n + 2; i++) {
        for (int j = 1; j < m + 2; j++) {
            arr[i][j] = arr[i - 1][j] + arr[i][j - 1];
        }
    }
    cout << arr[n + 1][m + 1];
    return 0;
}
// 64 位输出请用 printf("%lld")

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

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

争不过朝夕,又念着往昔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值