一、选择题

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,其数据成员如下:
则构造函数中,成员变量一定要通过初始化列表来初始化的是:()

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

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

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数列

入口:题目链接

题目描述:
【C++】笔试训练(七)-LMLPHP

题目解析
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、合法括号序列判断

入口:题目链接

题目描述:
【C++】笔试训练(七)-LMLPHP
解题思路
用栈结构实现,栈中存放左括号,当遇到右括号之后,检查栈中是否有左括号,如果有则出栈,如果没有,则说明不匹配。

代码展示

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();
    }
};
01-26 06:44