目录
一、选择题
1、
解析:内联函数是一种可以提高函数执行效率的方法,它的原理是编译时在函数调用点直接展开函数体的代码,从而避免了函数调用的开销。
但是,内联函数也有一些限制和缺点,比如:
- 内联函数不能包含复杂的结构控制语句,例如循环语句和 switch 语句,否则会导致代码膨胀和效率降低。
- 内联函数不能是直接递归函数,即自己内部还调用自己的函数,否则会造成无限循环或栈溢出。
- 内联函数的定义必须出现在内联函数第一次被调用之前,否则编译器无法展开函数体。
- 内联函数只是对编译器的一个建议,编译器可以根据函数的复杂度和调用频率来决定是否真正进行内联。
因此,适宜采用内联函数的情况是:函数代码少、频繁调用,并且没有复杂的流程控制和递归调用。这样可以最大程度地利用内联函数的优势,提高程序的运行速度。答案选C。
2、
解析:缺省参数(默认参数):在声明和定义函数时,可以给函数的参数带上一个默认值;在调用函数时,如果用户没有传递实参,则使用定义时所给的默认值,如果用户传递了实参,就使用用户传递的实参。
全缺省参数:每个参数都有默认值;
半缺省参数:部分参数具有默认值,并且默认值必须从右往左依次给出,例如:
void f(int a, int b = 20, int c = 10)编译成功
void f(int a = 10, int b, int c = 20)编译失败。答案为D。
3、
解析:类定义2种方式:
1、可以将声明和成员函数的定义全部放在类中
2、类中只放成员变量和成员函数的声明,成员函数的定义可以放在.cpp文件中定义,注意:成员函数名前必须添加类名
class:默认访问权限private;struct:默认的访问权限public
建议:将成员变量设置为private将成员函数设置为public。答案为A。
4、
解析:构造函数的特点有以下几点:
- 构造函数的名称必须与类名相同,区分大小写;
- 构造函数没有返回值,也不能用void修饰;
- 构造函数可以用任何访问修饰符(public、protected和private)修饰;
- 构造函数不能用static、final、abstract和synchronized等关键字修饰;
- 构造函数不能被覆写(override);
- 构造函数可以被重载(overload),以参数的个数、类型及顺序区分;重载意味着一个类里可以有多个构造函数,构造函数1可以调用构造函数2完成对象初始化,通过this关键字:this(参数1,参数2...)实现;答案为C。
5、
解析:一般来说,使用初始化列表比在构造函数内部赋值更高效,因为初始化列表可以直接调用成员变量的构造函数 ,而不需要先调用默认构造函数再进行赋值。而且,有些情况下必须使用初始化
(1)常量成员,因为常量只能初始化不能赋值 ,所以必须放在初始化列表里面
(2)引用类型,引用必须在定义的时候初始化,并且不能重新赋值 ,所以也要写在初始化列表里面
(3)没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数或其他合适的构造函数初始化。答案选B。
6、
解析:如果将运算符符重载成类的成员函数,形参个数要比该运算符需要的参数个数少1,因为成员函数具有隐藏的this指针。如果类中具有单个参数的构造函数,该构造函数具有类型转换的作用,对于B选项,编译器在编译代码节点,会调用单参构造函数将3转换为BigNumber的对象
但是D选项第一个参数不是对象,没有this指针,所以错误,
7、
解析:友元函数是C++中的一种特殊函数,它具有访问类中私有成员的权限,即使该函数不是类的成员函数。友元函数可以在类内部声明为友元或在类外部声明为友元。
D是错误的,友元函数是有关键字friend修饰,但是调用的时候不是通过指针this调用的,因为友元函数不属于任何类没有this指针。
二、算法题
1.Fibonacci数列
解析:找到两个斐波那契数,使得F[i]<=n<=fF[i+1],然后计算n到两个数之间的距离。
代码:
cpp
#include <iostream>
using namespace std;
int main() {
int n;
while(cin>>n)
{
int f0=0,f1=1,f2=1;
int step=0;
while(n>f2)
{
f0=f1;
f1=f2;
f2=f1+f0;
}
step=(f2-n)<(n-f1)?(f2-n):(n-f1);
cout<<step;
}
}
2.合法括号序列判断
解析:本题考察对栈的应用。用栈结构实现,栈中存放左括号,当遇到右括号之后,检查栈中是否有左括号,如果有则出栈,如果没有,则说明不匹配。当把字符串遍历完全之后,检查栈是否为空,为空则说明是合法括号序列。
代码:
cpp
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
stack<char> sc;
for (auto ele : A) {
switch (ele) {
case '(':
sc.push(ele);
break;
case ')': {
if (sc.empty() || sc.top() != '(')
return false;
else
sc.pop();
}
break;
default:
return false;
}
}
return true;
}
};