目录
一、选择题
二、编程题
三、选择题题解
四、编程题题解
一、选择题
1、某函数申明如下()
void Func(int &nVal1);
A. Func(a)
B. Func(&a)
C. Func(*a)
D. Func(&(*a))
2、C++语言中,类ClassA的构造函数和析构函数的执行次数分别为()
ClassA *pclassa=new ClassA[5];
delete pclassa;
A. 5,1
B. 1,1
C. 5,5
D. 1,5
3、动态内存分配(C语言中malloc,C++中的new)得到的存储区属于内存中的:
A. 静态区
B. 堆(heap)
C. 栈(stack)
D. 堆栈
E. 内核内存
F. 不确定
4、下列静态数据成员的特性中,错误的是()
A. 引用静态数据成员时,要在静态数据成员名前加和作用域符号
B. 说明静态数据成员时前边要加关键字static来修饰
C. 静态数据成员在类体外进行初始化
D. 静态数据成员不是所有对象所共有的
5、用class关键字定义的类,其成员默认的访问属性为()
A. private
B. protected
C. public
D. 无定义
6、在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是 ( )。
A. 无操作数的运算符
B. 二元运算符
C. 前缀一元运算符
D. 后缀一元运算符
7、有如下程序:运行时的输出结果是
#include<iostream>
using namespace std;
class MyClass
{public:MyClass(int i=0){cout<<1;}MyClass(const MyClass&x){cout<<2;}MyClass& operator=(const MyClass&x){cout<<3; return*this;}~MyClass(){cout<<4;}
};
int main()
{MyClass obj1(1),obj2(2),obj3(obj1);return 0;
}
A. 121,444
B. 112,444
C. 11,114,444
D. 11,314,445
E. 11,314,444
8、下面有关c++静态数据成员,说法正确的是()
A. 不能在类内初始化
B. 不能被类的对象调用
C. 不能受private修饰符的作用
D. 可以直接用类名调用
9、在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
A. 将构造函数设为私有
B. 将析构函数设为私有
C. 将构造函数和析构函数均设为私有
D. 没有办法能做到
10、下列的模板声明中,其中几个是正确的()
1)template
2)template<T1,T2>
3)template<class T1,T2>
4)template<class T1,class T2>
5)template<typename T1,T2>
6)template<typename T1,typename T2>
7)template<class T1,typename T2>
8)<typename T1,class T2>
A. 2
B. 3
C. 4
D. 5
二、编程题
1、另类加法 题目链接
2、走方格的方案数 题目链接
三、选择题题解
1、某函数声明如下()
void Func(int &nVal1);
A. Func(a)
B. Func(&a)
C. Func(*a)
D. Func(&(*a))
正确答案:A
题解:
我们观察函数,是引用,因此我们传参时,以一种类似 “传值” 的方式传参即可(底层是传指针,我们前面早已介绍过)
2、C++语言中,类ClassA的构造函数和析构函数的执行次数分别为()
ClassA *pclassa=new ClassA[5];
delete pclassa;
A. 5,1
B. 1,1
C. 5,5
D. 1,5
正确答案:A
题解:
注意题目new一个对象时,用了 [ ] ,因此首先会创建5个classA对象的空间,然后再调用5次构造函数,而delete时,由于没有方括号因此只会调用一次析构函数,然后再所释放其空间,因此只调用一次析构;
3、动态内存分配(C语言中malloc,C++中的new)得到的存储区属于内存中的:
A. 静态区
B. 堆(heap)
C. 栈(stack)
D. 堆栈
E. 内核内存
F. 不确定
正确答案:B
题解:
动态内存分配申请的空间来自于堆,概念题;
4、下列静态数据成员的特性中,错误的是()
A. 引用静态数据成员时,要在静态数据成员名前加和作用域符号
B. 说明静态数据成员时前边要加关键字static来修饰
C. 静态数据成员在类体外进行初始化
D. 静态数据成员不是所有对象所共有的
正确答案:D
题解:
静态成员变量属于这个类的所有对象,并不属于某个具体的对象;选D错误;
5、用class关键字定义的类,其成员默认的访问属性为()
A. private
B. protected
C. public
D. 无定义
正确答案:A
题解:
class的成员默认访问权限为private,默认继承权限也为private,struct的成员默认访问权限为public,默认继承权限也为public;
6、在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是 ( )。
A. 无操作数的运算符
B. 二元运算符
C. 前缀一元运算符
D. 后缀一元运算符
正确答案:C
题解:
当重载运算符为成员函数时,若其中没有任何参数,由于其是类的成员函数,故会传this指针,故应该为前缀一元运算符,若给参数int,则为后缀一元操作符;
7、有如下程序:运行时的输出结果是
#include<iostream>
using namespace std;
class MyClass
{public:MyClass(int i=0){cout<<1;}MyClass(const MyClass&x){cout<<2;}MyClass& operator=(const MyClass&x){cout<<3; return*this;}~MyClass(){cout<<4;}
};
int main()
{MyClass obj1(1),obj2(2),obj3(obj1);return 0;
}
A. 121,444
B. 112,444
C. 11,114,444
D. 11,314,445
E. 11,314,444
正确答案:B
题解:
分别创建3个对象,对象1和对象2使用的是构造函数,对象3是用拷贝构造进行初始化,因此会打印112,接着析构三个对象,打印444;
8、下面有关c++静态数据成员,说法正确的是()
A. 不能在类内初始化
B. 不能被类的对象调用
C. 不能受private修饰符的作用
D. 可以直接用类名调用
正确答案:D
题解:
A选项,对于普通静态数据成员,确实只能再类内声明,再类外进行定义,而const 修饰的静态整型家族数据成员,可以在类内定义,这是一种特殊语法;B选项,可以被类的对象调用;C选项,可以被private修饰;D选项,正确;
9、在C++中,为了让某个类只能通过new来创建(即如果直接创建对象,编译器将报错),应该()
A. 将构造函数设为私有
B. 将析构函数设为私有
C. 将构造函数和析构函数均设为私有
D. 没有办法能做到
正确答案:B
题解:
假设我们将构造函数私有,由于构造函数私有,确实不能直接创建对象了,但是我们也不能通过new构造对象了,因此new主要分为两步,1、申请空间;2、调用构造进行初始化;,因此A错误;B选项,当我们将析构函数私有后,由于只能在类内调用析构,而我们一般创建的对象在出作用域时调用析构,由于无法调用析构,因此编译器也不允许我们直接构造对象,但由于构造并没有被封,我们可以通过new构造对象,然后如果我们需要析构这个对象,我们需要实现一个公有的方法,在这个公有的方法里调用析构,然后我们通过这个公有的方法进行析构;故B正确;
10、下列的模板声明中,其中几个是正确的()
1)template
2)template<T1,T2>
3)template<class T1,T2>
4)template<class T1,class T2>
5)template<typename T1,T2>
6)template<typename T1,typename T2>
7)template<class T1,typename T2>
8)<typename T1,class T2>
A. 2
B. 3
C. 4
D. 5
正确答案:B
题解:
根据语法,每个类型参数前都必须由class或者typename,可以混用,故(4)(6)(7)都正确;选B;
四、编程题题解
1、另类加法
题解:我们利用异或的不进位加法特性进行解题,具体如下;
我们得到了非进位的加法后的结果,那我们如何得到加法的进位呢?首先我们要清楚二进制的进位是两个二进制位都为1,相加后往后一位进1,你是否联想到了什么?我们是否可以通过两个数相与之后,在使用左移运算符,向左移动一位;这不就得到了我们的进位吗?
即 进位的数 = (A & B)<< 1;
我们将进位的值与不进位相加的值进行相加不就是结果的值吗?(用或运算符)但是这个结果也是不准确的,因为我们要考虑连续进位的情况;因此有了以下代码;
class UnusualAdd
{
public:int addAB(int A, int B) {// 可能会出现连续进位的情况while(B){int tmp = (A & B) << 1; // 进位的值A ^= B; // 不进位相加后的值B = tmp;}return A;}
};
2、走方格的方案数
题解:本题主要使用动态规划的思路进行解题,具体如下;
有了以上的思路,具体我们还是来看代码是如何实现的;如下所示;
#include <iostream>
#include <vector>
using namespace std;int main()
{int n, m;cin >> n >> m;// 注意这里多开一个空间,因为题目给的是网格数vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));// 注意这里也必须都是小于等于for(int i = 0; i <= n; i++){for(int j = 0; j <= m; j++){if(i == 0 || j == 0){dp[i][j] = 1;}else {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}cout << dp[n][m] << endl;return 0;
}