选择题
解析:内联函数(
inline
)一般用于代码较少,代码块里面没有递归且频繁调用的函数,是一种以空间换时间(不是指内存,而是指令变多编译出来的可执行程序会变大)的做法。内联函数在预编译的时候展开,会用函数体替换函数调用;内联函数可能会使目标文件变大,但是少了调用开销,增加程序运行的效率。
解析:函数默认的参数可以有多个;当参数为多数的时候,参数默认值应该从右往左进行缺省;参数可以不用设置默认值。
解析:对于类的默认访问权限:
class
默认访问权限是私有(private
)的,struct
默认访问权限是公有的(public
);类定义有2种方式:1.可以将声明和成员函数的定义全部放在类中;2.类中只放成员变量和成员函数的声明,成员函数的定义可以类外其他.cpp文件中,但是要注意成员函数名前要添加
类名::
。成员可以声明为私有的也可以声明为公共的,通常建议将成员变量设置为
private
,成员函数设置为public
。
解析:调用构造函数时候,传参为
aa = 4 ,bb = 5
;a = aa--
后置--
,是先使用再--
,所以a = 4
;b = a * bb
,所以b = 20
。下面为该类的实现,其中类中的成员为private
,所以只能在类里面进行访问。
解析:这道题是考察构造函数。无参的构造函数、全缺省的构造函数及编译器自动生成的构造函数都被称为默认构造函数。
A 构造函数是没有返回值的,不可以声明返回类型;
B 一般情况下构造函数的权限都是public,因为在类外创建对象时,编译器要调用构造函数,但也有特殊情况,构造函数可以用
private
进行修饰,但是修饰之后就不会在外部进行调用;单例模式:一个类只能创建一个对象,这时候会将构造函数设置为private,所以错误;C 构造函数必须与类名相同,正确;
D 构造函数也是个函数,可以带参数。
解析:必须用初始化列表初始化的是:自定义类型,
const
修饰的类型,引用类型。所以b,c需要用初始化列表进行初始化。静态变量虽然有cosnt
修饰,但是也是静态变量,静态变量必须在全局进行初始化。
如果将运算符重载成类的成员函数,形参个数要比该运算符操作数个数少1,因为成员函数含有隐藏的this指针
A 正确,是普通整形之间的加法
B中左操作数是 BigNumber类型,可以调用重载运算符,相当于b1.operator+(3),可以将3类型转换成BigNumber类,正确;
C 中相当于b1.operator+(b2),this指针代表左操作数,正确;
D 3不是BigNumber类型的对象,不能调用类中的函数,更不能够代表this指针,所以错误。可以写成类的友元函数方便这样使用。
解析:友元函数可以让本类和友元类对象调用;友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数;类的成员函数是属于类的,调用的时候是通过指针
this
调用的;对于友元函数,是没有this
指针的,友元函数打破了类访问限定符的限制,可以访问私有成员变量或者成员函数。所以D选项错误。
解析:变量
p
是在栈上创建的,它是由操作系统分配的,new
和malloc
的功能类似,new
出来的东西在堆区,是用户进行申请的。
解析:类模板实例化之后就会变成一个具体的类。
编程题
1.Fibonacci数列
解析:简单dp问题。我们先通过迭代找到距离N最相近的两个斐波那契数,然后通过比较计算得到哪个更近。注意在迭代的时候要先进行交换,再计算third的值。
#include <iostream>
using namespace std;
int main() {
int N = 0;
cin >> N;
int first = 0;
int second = 1;
int third = 1;
//当N为0时,要单独进行计算
if(N == 0){
cout << "0";
return 0;
}
while(third < N)
{ //一定要先进行交换,再计算third
first = second;
second = third;
third = first + second;
}
int count1 = third - N;
int count2 = N - second;
int min = (count1 < count2) ? count1:count2;
cout << min;
return 0;
}
答案解析:本题是对于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 N, f, l = 0,r = 0,f0 = 0,f1 = 1;
cin >> N;
while(1){
f = f0 + f1;
f0 = f1;
f1 = f;
//找到比N小且距离N最近的数,求出距离
if(f < N)
l = N-f;
else
{
//找到比N大且距离N最近的数,求出距离
r = f - N;
break;
}
}
//取最小距离
cout << min(l,r) << endl;
return 0;
}
2.合法括号序列判断
解析:本题利用栈操作,比较简单。首先检查一下字符串中是否有其他的字符;然后将字符为
(
的入栈;遇见)
出栈,确保都是成对;也要考虑出栈的时候栈为空,栈为空说明栈里面没有元素却遇见了)
,此时已经说明不成立了,直接返回false。当循环结束,判断栈是否为空,不为空说明不成立,返回false;为空说明成立,返回true。
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
// write code here
stack<char> s1;
for(int i = 0; i < n; i++)
{
//判断是否有其他的字符
if(A[i] != '(' && A[i] != ')')
return false;
//当为(的时候进栈
if(A[i] == '(')
s1.push(A[i]);
//当为)的时候出栈,且在出栈的时候要判断栈是否为空
if(A[i] == ')')
{
//如果栈为空,直接返回false
if(s1.empty())
return false;
s1.pop();
}
}
//判断栈是否为空,如果不为空则返回false;如果为空,返回true
if(s1.empty())
return true;
else
return false;
}
};
答案解析:本题考查的是对栈的应用
【解题思路】:
用栈结构实现,栈中存放左括号,当遇到右括号之后,检查栈中是否有左括号,如果有则出栈,如果没有,则说明不匹配。
class Parenthesis {
public:
bool chkParenthesis(string A, int n) {
// write code here
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;
}
};