C++笔试强训7


一、选择题

1-5题

在这里插入图片描述
基础知识,函数代码少,频繁调用的时候才适合定义内联函数。
故选C。

在C++中,inline关键字是用来向编译器建议将函数体在每个调用点“内联展开”的。这意味着编译器会尝试将函数的代码直接插入到每个调用该函数的地方,而不是像通常那样进行函数调用(即,生成调用指令,跳转到函数代码,执行函数体,然后返回)。内联函数可以减少函数调用的开销,尤其是对于那些体积小、调用频繁的函数来说非常有用。然而,是否真正内联一个函数是由编译器决定的,编译器会基于多种因素(如函数体大小、优化级别、是否有递归调用等)来决定是否进行内联。

以下是一些适合使用inline定义内联函数的场景:

  1. 小型函数:函数体很小,只有几行代码。这些函数通常执行简单的操作,如计算或访问数据成员。

  2. 频繁调用的函数:如果函数在程序中频繁被调用,那么内联这些函数可以减少调用开销,提高程序的执行效率。

  3. 模板函数:模板函数通常因为模板实例化而产生大量的函数副本,这些副本往往很小且相似。将它们声明为内联可以减少代码膨胀。

  4. 不会引起副作用的函数:内联函数应该避免修改全局变量或执行其他会影响程序状态的操作,因为内联展开可能会使这些副作用在多个地方发生,导致程序行为难以预测。

  5. 类的成员函数:尤其是访问器(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();
    }
};

运行结果:
在这里插入图片描述


  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

争不过朝夕,又念着往昔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值