一、选择题
1、在()情况下适宜采用 inline 定义内联函数
A 函数体含有循环语句
B 函数体含有递归语句
C 函数代码少、频繁调用
D 函数代码多,不常调用
答案:C
解析:概念:inline修饰的函数称为内联函数
特性:在编译阶段,会将内联函数展开----将函数调用直接使用函数体来进行替换
作用:少了函数调用参数压栈以及创建栈帧等开销----可以提高程序运用的效率
注意:inline是一个建议性的关键字----一般情况 建议:没有循环、没有递归、函数体不是很长,适宜采用 inline 定义内联函数
2、在 C++ 语言中,对函数参数默认值描述正确的是()
A 函数带默认值的参数只能有一个
B 一个函数的参数若有多个,则参数默认值的设定可以不连续
C 函数参数必须设定默认值
D 在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值
答案:D
解析:缺省参数(默认参数):在声明和定义函数时,可以给函数的参数带上一个默认值;在调用函数时,如果用户没有传递实参,则使用定义时所给的默认值,如果用户传递了实参,就使用用户传递的实参
全缺省参数:每个参数都有默认值
半缺省参数:部分参数具有默认值,并且:默认值必须从右往左依次给出
3、下面关于类定义的说法中,正确的是
A 类定义中包括数据成员和函数成员的声明
B 类成员的缺省访问权限是保护的
C 数据成员必须被声明为私有的
D 成员函数只能在类体外进行定义
答案:A
解析:A、类定义有2种方式:
1、可以将声明和成员函数的定义全部放在类中
2、类中只放成员变量和成员函数的声明,成员函数的定义可以放在.cpp文件中定义,注意:成员函数名前必须添加类名::
B、class:默认访问权限是private。struct:默认的访问权限是public
C、建议:将成员变量设置为private,将成员函数设置为public
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
5、下列关于构造函数的描述正确的是?
A 构造函数可以声明返回类型
B 构造函数不可以用private修饰
C 构造函数必须与类名相同
D 构造函数不能带参数
答案:C
解析:B、一般情况下,构造函数的权限都是public,因为在类外创建对象时,编译器要调用构造函数
特殊:单列模式----一个类只能创建一个对象----将构造函数设置为private
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
解析:初始化列表位置才是真正的初始化,构造函数体中只是赋值
初始化列表中:只能对类中非静态的成员变量进行初始化
那些成员必须在初始化列表的位置初始化:
1、const修饰的成员变量
2、引用类型的成员变量
3、类类型对象,该类没有默认的构造函数
例子:
class B
{
public:
//该构造函数是一个普通的构造函数,不是一个默认的构造函数
B(int b)
:_b(b)
{
_b = 10;
}
private:
int _b;
};
class A
{
A()
//:_a(10)
: _b(30)
, _ra(_a)
, _bb(30)
{
_a = 20;
}
private:
int _a;
const int _b;
int& _ra;
B _bb;
};
int main()
{
return 0;
}
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
解析:如果将运算符重载成类的成员函数,形参个数要比该运算符需要的参数个数少1,因为成员函数具有隐藏的this指针
BigNumber operator+():对两个BigNumber的对象进行相加
B、如果类中具有单个参数的构造函数,该构造函数具有类型转换的作业,编译器在编译代码节点,会调用单参构造函数将3转换为BigNumber的对象
8、下面有关友元函数与成员函数的区别,描述错误的是?
A 友元函数可以让本类和友元类对象调用
B 友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数
C 类的成员函数是属于类的,调用的时候是通过指针this调用的
D 友元函数是有关键字friend修饰,调用的时候也是通过指针this调用的
答案:D
解析:友元函数:不是类的成员函数,不能用指针this调用----但是在友元函数中可以访问类中私有的成员
成员函数:具有隐藏的this,受访问限定符的约束,通过对象来调用
9、对于以下代码,说法正确的是()
char* p = new char[100];
A p 和 new出来的内存都在栈上
B p 和 new出来的内存都在堆上
C p在栈上 new出来的在堆上
D p在堆上 new出来的在栈上
答案:C
解析:new:C++中用来从动态申请空间的,默认情况下new底层调用的是operator new --> malloc
new默认情况下申请的空间在堆上
全局作用域中:p的空间在数据段
函数体中:p的空间就在栈上
10、类模板的使用实际上是类模板实例化成一个具体的()
A 类
B 函数
C 模板类
D 对象
答案:A
解析:
二、编程题
1、Fibonacci数列
入口:题目链接
题目描述:
题目解析
Fibonacci数列的性质是第一项和第二项都为1,后面的项形成递归:F(n) = F(n - 1) + F(n - 2)
解题思路
可以通过先找到距离N最近的两个Fibonacci数,这两个数分别取自距离N的最近的左边一个数L和右边一个数R,然后通过min(N - L, R - N)找到最小步数
代码展示
#include <iostream>
using namespace std;
int main()
{
int f, f1 = 0, f2 = 1;
int n, left = 0, right = 0;
cin >> n;
while (1)
{
f = f1 + f2;
f1 = f2;
f2 = f;
if (f < n)
{
left = f;
}
else
{
right = f;
break;
}
}
cout << min(n - left, right - n) << endl;
return 0;
}
2、合法括号序列判断
入口:题目链接
题目描述:
解题思路
用栈结构实现,栈中存放左括号,当遇到右括号之后,检查栈中是否有左括号,如果有则出栈,如果没有,则说明不匹配。
代码展示
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
// write code here
stack<char> sc;
for (auto ch : A)
{
switch (ch)
{
case '(':
sc.push(ch); break;
case ')':
if (sc.empty())
{
return false;
}
sc.pop();
break;
default:
return false;
}
}
return sc.empty();
}
};