文章目录
- 一、选择题
- 1-5题
- 6-10题
- 二、编程题
- 题目一
- 题目二
一、选择题
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
静态数据成员的特性
-
所有对象共享:类的所有对象共享同一个静态数据成员,因此,通过任何对象所做的修改都会影响所有对象。
-
访问:静态数据成员可以通过类名和作用域解析运算符(
::
)来访问,也可以通过类的对象来访问,但后者通常不推荐,因为它可能会误导读者认为该成员是非静态的。 -
初始化:静态数据成员必须在类外部定义和初始化(除非它们是const整型或枚举类型,并且使用C++11或更高版本的初始化器列表在类内初始化)。
-
存储位置:静态数据成员存储在全局数据区,而不是在类的任何特定对象内。
-
生命周期:静态数据成员的生命周期与程序相同,从程序启动到程序结束。
-
默认访问级别:如果静态数据成员没有在类定义中指定访问修饰符(如
public
、protected
或private
),则它们默认为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++中的静态数据成员是类的成员,但它不是类的任何特定对象的实例的一部分。静态数据成员在类的所有对象之间共享,即类的所有对象都访问同一个静态成员变量。静态数据成员在程序开始时分配内存,并在程序结束时销毁。
静态数据成员的特性
-
所有对象共享:类的所有对象共享同一个静态数据成员,因此,通过任何对象所做的修改都会影响所有对象。
-
访问:静态数据成员可以通过类名和作用域解析运算符(
::
)来访问,也可以通过类的对象来访问,但后者通常不推荐,因为它可能会误导读者认为该成员是非静态的。 -
初始化:静态数据成员必须在类外部定义和初始化(除非它们是const整型或枚举类型,并且使用C++11或更高版本的初始化器列表在类内初始化)。
-
存储位置:静态数据成员存储在全局数据区,而不是在类的任何特定对象内。
-
生命周期:静态数据成员的生命周期与程序相同,从程序启动到程序结束。
-
默认访问级别:如果静态数据成员没有在类定义中指定访问修饰符(如
public
、protected
或private
),则它们默认为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")
运行结果: