文章目录
- 一、选择题
- 1-5题
- 6-10题
- 二、编程题
- 题目一
- 题目二
一、选择题
1-5题
基础知识,函数代码少,频繁调用的时候才适合定义内联函数。
故选C。
在C++中,inline
关键字是用来向编译器建议将函数体在每个调用点“内联展开”的。这意味着编译器会尝试将函数的代码直接插入到每个调用该函数的地方,而不是像通常那样进行函数调用(即,生成调用指令,跳转到函数代码,执行函数体,然后返回)。内联函数可以减少函数调用的开销,尤其是对于那些体积小、调用频繁的函数来说非常有用。然而,是否真正内联一个函数是由编译器决定的,编译器会基于多种因素(如函数体大小、优化级别、是否有递归调用等)来决定是否进行内联。
以下是一些适合使用inline
定义内联函数的场景:
-
小型函数:函数体很小,只有几行代码。这些函数通常执行简单的操作,如计算或访问数据成员。
-
频繁调用的函数:如果函数在程序中频繁被调用,那么内联这些函数可以减少调用开销,提高程序的执行效率。
-
模板函数:模板函数通常因为模板实例化而产生大量的函数副本,这些副本往往很小且相似。将它们声明为内联可以减少代码膨胀。
-
不会引起副作用的函数:内联函数应该避免修改全局变量或执行其他会影响程序状态的操作,因为内联展开可能会使这些副作用在多个地方发生,导致程序行为难以预测。
-
类的成员函数:尤其是访问器(getter)和修改器(setter)函数,这些函数通常很简短,并且频繁被调用。将它们定义为内联可以提高效率。
函数参数默认值又叫缺省参数,缺省参数必须从右向左开始缺省,必须连续给定缺省值,也就是说,从左到右,一旦遇到一个参数是缺省的,那么之后的参数也必须都是缺省的。
函数参数不是必须设定默认值,可设可不设。
故选D
类成员的缺省访问权限是私有的private,B错;
数据成员不是必须声明为私有的,C错;
成员函数类内类外定义都行,D错;
故选A
aa是4,bb是5,a=aa–后,a是4,aa是3,b=abb后b=45=20
故a是4b是20
故选D
构造函数没有返回类型,构造函数函数名必须和类名相同,构造函数可以带参数,带参数的和不带的可以构成函数重载。
构造函数可以用private修饰
故选C
6-10题
const修饰的变量和引用类型必须利用初始化列表赋值,static const可以在类外初始化。故选B。
初始化列表位置才是真正的初始化,构造函数体中只是赋值
初始化列表中:只能对类中非静态的成员变量来进行初始化
那些成员必须在初始化列表的位置初始化:
1.const修饰的成员变量
2.引用类型的成员变量
3.类类型对象,该类没有默认的构造函数
如果将运算符符重载成类的成员函数,形参个数要比该运算符需要的参数个数少1
因为:成员函数具有隐藏的this指针
B选项 如果类中具有单个参数的构造函数,该构造函数具有类型转换的作用,可以用explicit来禁止这种隐式类型转换。
b1 + 3 编译器在编译代码节点,会调用单参构造函数将3转换为BigNumber的对象
C选项,没啥问题,符合重载的作用
D,因为+是双目运算符,所以重载+时第一个参数是隐藏的this指针,所以+左边必须是一个对象,D错。
故选D。
描述错误的是 D:友元函数是有关键字friend
修饰,调用的时候也是通过指针this
调用的。
解析:
A. 正确。友元函数是定义在类外部,但在类内部通过friend
关键字声明,因此它可以被本类和友元类(或函数)的对象调用。
B. 正确。友元函数和类的成员函数都可以访问类的私有成员变量或成员函数。友元函数通过friend
声明获得对类私有成员的访问权限,而成员函数则自然地拥有这种权限。
C. 正确。类的成员函数是属于类的,它们通过隐含的this
指针来访问类的成员变量和成员函数。这个this
指针指向调用成员函数的对象。
D. 错误。友元函数虽然通过friend
关键字声明,但它不是类的成员函数,因此它不能通过this
指针来调用。友元函数是在类外部定义的普通函数,它只能通过传入的参数(如果有的话)来访问类的成员,或者通过类的对象显式地访问(如果该函数设计为接受类的对象作为参数)。this
指针是类成员函数特有的,用于指向调用该函数的对象。友元函数并不具备这种特性。
p是指针变量,在栈上,p指向的内存即new出来的在堆上,故选C。
对这块不太清楚的可以点下面的超链接去看看我的另一篇文章。
内存管理
选A。
二、编程题
题目一
题目链接:
Fibonacci数列
提交代码:
#include <iostream>
using namespace std;int main() {int num;cin >> num;int f1 = 0, f2 = 1;while (true) {if (num < f2) {break;}int tmp = 0;tmp = f2;f2 = f1 + f2;f1 = tmp;}cout << min(f2 - num, num - f1);
}
// 64 位输出请用 printf("%lld")
运行结果:
题目二
题目链接:
合法括号序列判断
提交代码:
class Parenthesis {public:bool chkParenthesis(string A, int n) {stack<char> s;for (int i = 0; i < n; i++) {if (A[i] == '(') {s.push(A[i]);} else if (A[i] == ')' && !s.empty()) {s.pop();} else return false;}return s.empty();}
};
运行结果: