目录
一、选择题
二、编程题
三、选择题题解
四、编程题题解
一、选择题
1、在()情况下适宜采用 inline 定义内联函数
A. 函数体含有循环语句
B. 函数体含有递归语句
C. 函数代码少、频繁调用
D. 函数代码多,不常调用
2、在 C++ 语言中,对函数参数默认值描述正确的是()
A. 函数带默认值的参数只能有一个
B. 一个函数的参数若有多个,则参数默认值的设定可以不连续
C. 函数参数必须设定默认值
D. 在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值
3、下面关于类定义的说法中,正确的是:
A. 类定义中包括数据成员和函数成员的声明
B. 类成员的缺省访问权限是保护的
C. 数据成员必须被声明为私有的
D. 成员函数只能在类体外进行定义
4、假定一个类的构造函数为A(int aa,int bb){a=aa--;b=a*bb;},则执行A x(4,5);语句后,x.a和x.b的值分别为()
A. 20和5
B. 3和15
C. 5和4
D. 4和20
5、下列关于构造函数的描述正确的是
A. 构造函数可以声明返回类型
B. 构造函数不可以用private修饰
C. 构造函数必须与类名相同
D. 构造函数不能带参数
6、有一个类A,其数据成员如下,则构造函数中,成员变量一定要通过初始化列表来初始化的是:____。
A. a b c
B. b c
C. b c d e
D. b c d
E. b
F. c
7、C++ 中,有如下类模板定义,已知 b1, b2 是 BigNumber 的两个对象,则下列表达式中错误的是()
template<class T> class BigNumber
{
long n;
public:
BigNumber(T i) :n(i) {}
BigNumber operator+(BigNumber b)
{
return BigNumber(n + b.n);
}
};
A. 3+3
B. b1+3
C. b1+b2
D. 3+b1
8、下面有关友元函数与成员函数的区别,描述错误的是?
A. 友元函数可以让本类和友元类对象调用
B. 友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数
C. 类的成员函数是属于类的,调用的时候是通过指针this调用的
D. 友元函数是有关键字friend修饰,调用的时候也是通过指针this调用的
9、对于以下代码,说法正确的是()
char * p = new char[100];
A. p 和 new出来的内存都在栈上
B. p 和 new出来的内存都在堆上
C. p在栈上 new出来的在堆上
D. p在堆上 new出来的在栈上
10、类模板的使用实际上是类模板实例化成一个具体的__________。
A. 类
B. 函数
C. 模板类
D. 对象
二、编程题
1、Fibonacci数列 题目链接
2、合法括号序列判断 题目链接
三、选择题题解
1、在()情况下适宜采用 inline 定义内联函数
A. 函数体含有循环语句
B. 函数体含有递归语句
C. 函数代码少、频繁调用
D. 函数代码多,不常调用
正确答案:C
题解:
基本概念题;
2、在 C++ 语言中,对函数参数默认值描述正确的是()
A. 函数带默认值的参数只能有一个
B. 一个函数的参数若有多个,则参数默认值的设定可以不连续
C. 函数参数必须设定默认值
D. 在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值
正确答案:D
题解:
当一个参数设置默认值后,其参数后面定义的所有参数都必须设定默认值,这么做是为了防止在函数调用出产生歧义;
3、下面关于类定义的说法中,正确的是:
A. 类定义中包括数据成员和函数成员的声明
B. 类成员的缺省访问权限是保护的
C. 数据成员必须被声明为私有的
D. 成员函数只能在类体外进行定义
正确答案:A
题解:
A正确,B选项中,若用struct定义类,类成员的默认访问权限为public,若用class定义,类成员的默认访问权限为private;C选项中,数据成员的声明不一定要私有;D选项中,成员函数也可以在类内定义,在类内定义时,默认加上内联函数关键字;
4、假定一个类的构造函数为A(int aa,int bb){a=aa--;b=a*bb;},则执行A x(4,5);语句后,x.a和x.b的值分别为()
A. 20和5
B. 3和15
C. 5和4
D. 4和20
正确答案:D
题解:
当我们执行A(4,5)时,首先执行a = aa--;此时为后置--,故a的值为4;再执行b = a*bb;a的值为4,bb的值为5,因此b被赋值20;
5、下列关于构造函数的描述正确的是
A. 构造函数可以声明返回类型
B. 构造函数不可以用private修饰
C. 构造函数必须与类名相同
D. 构造函数不能带参数
正确答案:C
题解:
A选项,构造函数没有返回值;B选项,构造函数可以用private修饰,只不过引用private修饰后,在类外不能调用构造函数,只能提供静态的成员函数构造;C选项,正确;D选项,构造函数可以带参数;
6、有一个类A,其数据成员如下,则构造函数中,成员变量一定要通过初始化列表来初始化的是:____。
class A
{
private:
int a;
public:
const int b;
float* &c;
static const char* d;
static double* e;
};
A. a b c
B. b c
C. b c d e
D. b c d
E. b
F. c
正确答案:B
题解:
a为普通整型,可以在构造函数体内初始化;b为const int类型,const修饰的变量必须初始化,且只有一次初始化的机会,所以只能在初始化列表初始化;c为浮点类型指针的引用,引用也必须初始化,且只有一次初始化的机会,之后不能再引用别的对象了;d为静态的指针常量,指向的内容不可修改,但是可以改变该指针的指向,不一定要在初始化列表中初始化;e为静态的双精度浮点型,可以不在初始化列表初始化;
7、C++ 中,有如下类模板定义,已知 b1, b2 是 BigNumber 的两个对象,则下列表达式中错误的是()
template<class T> class BigNumber
{
long n;
public:
BigNumber(T i) :n(i) {}
BigNumber operator+(BigNumber b)
{
return BigNumber(n + b.n);
}
};
A. 3+3
B. b1+3
C. b1+b2
D. 3+b1
正确答案:D
题解:
观察该类,重载了+号,其参数是同类对象;A选项,两个整型常量相加,表达式正确;B选项,一个该类对象加上一个整型,该整形会发生隐式类型转换,用这个3构造出一个临时对象,再用这个临时对象拷贝构造出了一个该类对象,因此该表达式也没问题;C选项,两个该类对象相加,也没问题;D选项,+的做参数必须为该类对象,而D选项的左参数为整型,故D错误;
8、下面有关友元函数与成员函数的区别,描述错误的是?
A. 友元函数可以让本类和友元类对象调用
B. 友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数
C. 类的成员函数是属于类的,调用的时候是通过指针this调用的
D. 友元函数是有关键字friend修饰,调用的时候也是通过指针this调用的
正确答案:D
题解:
友元函数没有this指针,因此调用的时候也不存在用this指针调用,故D错误;
9、对于以下代码,说法正确的是()
char * p = new char[100];
A. p 和 new出来的内存都在栈上
B. p 和 new出来的内存都在堆上
C. p在栈上 new出来的在堆上
D. p在堆上 new出来的在栈上
正确答案:C
题解:
p指针变量存在栈上,属于局部变量,而其指向的内容存放在堆中;
10、类模板的使用实际上是类模板实例化成一个具体的__________。
A. 类
B. 函数
C. 模板类
D. 对象
正确答案:A
题解:
类模板在编译期间实例化出对应的类,然后用该类实例化出类对象;
四、编程题题解
1、Fibonacci数列
思路:我们想要找到最接近的斐波那契数,我们要知道该数在斐波那契数列中的位置,我们分别找到其前面一个数与后面一个数,然后计算距离最短的即可;
#include <iostream>
using namespace std;
int main()
{
int num = 0;
cin >> num;
int f1 = 0;
int f2 = 1;
int f3 = f1 + f2;
while(f3 < num)
{
f1 = f2;
f2 = f3;
f3 = f1 + f2;
}
int ret = (num - f2) < (f3 - num) ? (num - f2) : (f3 - num);
cout << ret << endl;
return 0;
}
2、合法括号序列判断
思路:我们创建一个栈,然后循环遍历这个字符串,判断每一个字符,若为左括号,则进栈,若为右括号,且栈内有元素,则出栈,否则为非法;
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
stack<char> st;
for (int i = 0; i < n; i++) {
if (A[i] == '(') {
st.push('(');
} else if (A[i] == ')') {
// 右括号找不到匹配的左括号了,非法
if (st.empty())
return false;
st.pop();
} else {
return false;
}
}
// 循环结束,若栈为空,则合法,否则为非法
if (st.empty())
return true;
else
return false;
}
};