笔试强训 Day 7

本文介绍了C++中的内联函数,强调了其用于提高效率的原理和限制条件。还讨论了函数参数的默认值设定规则,类的成员定义,包括构造函数的特性和使用,以及友元函数与成员函数的区别。此外,涉及到类模板的实例化和动态内存管理。最后,提供了两个编程问题的解题思路,分别是合法括号序列的判断和斐波那契数列的应用。
摘要由CSDN通过智能技术生成

fei选择题:

1.在()情况下适宜采用 inline 定义内联函数
A 函数体含有循环语句
B 函数体含有递归语句
C 函数代码少、频繁调用
D 函数代码多,不常调用

复习一下内联函数

  • 在编译阶段,会将内联函数展开 —— 将函数调用替换成函数体
  • 少了函数调用参数压栈以及建立栈帧的开销,可以提高效率
  • 注意:inline是一个建议性的关键字 —— 具体情况看编译器,由编译器决定
  • 一般是:没有循环、没有递归、函数体不长

2.在 C++ 语言中,对函数参数默认值描述正确的是()
A 函数带默认值的参数只能有一个
B 一个函数的参数若有多个,则参数默认值的设定可以不连续
C 函数参数必须设定默认值
D 在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值

  • 缺省参数:备胎的存在
  • 可以全缺省,也可以半缺省:半缺省的默认值必须从右往左依次给出
  • void f(int a, int b = 20, int c = 10) —— 编译成功

3.下面关于类定义的说法中,正确的是:
A 类定义中包括数据成员和函数成员的声明
类成员的缺省访问权限是保护的
C 数据成员必须被声明为私有的
D 成员函数只能在类体外进行定义 

类的两种定义:

  1. 将声明和成员函数的定义全部放在类中
  2. 类中放成员变量和成员函数的声明,成员函数的定义可以放在.cpp中,注意成员函数名前必须添加类名::

类成员的缺省访问权限是私有的(private),数据成员被声明成私有是错误的;成员函数也可以在类中定义

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 

  • a=aa–;是先赋值再–,所以a还是等于4;bb是5,所以4*5 = 20

5.下列关于构造函数的描述正确的是?

A 构造函数可以声明返回类型
B 构造函数不可以用private修饰
C 构造函数必须与类名相同
D 构造函数不能带参数

复习一下:

  1. 构造函数没有返回值,必须和类名相同,且不能带参数
  2. 一般情况下,构造函数权限都是public,因此在类外创建对象时,编译器要调用构造函数(特殊情况:单例模式 —— 一个类只能创建一个对象,将构造函数设置为private)

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

  • 初始化列表位置才是真正的初始化,构造函数体中(是赋值)也会回到初始化列表
  • 初始化列表中:只对类中非静态的成员变量进行初始化(静态的是大家共有的,放在类外)
  • 必须在初始化列表中初始化的有
    1️⃣const修饰的成员变量
    2️⃣引用类型的成员变量
    3️⃣类类型对象,该类没有默认的构造函数

7.C++ 中,有如下类模板定义: 

template<class T> class BigNumber{
	long n;
public:
	BigNumber(T i) :n(i) {}
	BigNumber operator+(BigNumber b) {
	return BigNumber(n + b.n);
	}
};

已知 b1, b2 是 BigNumber 的两个对象,则下列表达式中错误的是()
A 3+3
B b1+3
C b1+b2
D 3+b1

  • 运算符重载成类的成员函数,形参个数要比该运算符需要的参数少一个
  • 因为:成员函数隐含了this指针

A:内置类型直接相加是可以的;
B:b1+3;+是对两个BigNumber的对象相加的。
如果类中具有单个参数的构造函数,该构造函数具有类型转换的作用
b1+3;编译器在编译代码节点,会调用单参构造函数将3转换成BigNumber的对象
D:第一个参数一定要是BigNumber的对象,因为是this

8.下面有关友元函数与成员函数的区别,描述错误的是?
A 友元函数可以让本类和友元类对象调用
B 友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数
C 类的成员函数是属于类的,调用的时候是通过指针this调用的
D 友元函数是有关键字friend修饰,调用的时候也是通过指针this调用的

  • 友元函数:不是类的成员函数,没有this指针,在友元函数内部可以访问类中私有的成员
  • 成员函数:具有隐藏的this,通过对象来调用

9.对于以下代码,说法正确的是()

char * p = new char[100];

A p 和 new出来的内存都在栈上
B p 和 new出来的内存都在堆上
C p在栈上 new出来的在堆上
D p在堆上 new出来的在栈上

  • new:C++中用来从动态申请空间,默认情况下,new底层调用的是 operator new ——》 malloc ,所以申请的空间在堆上
  • 指针p全局作用域中在数据段中,若在函数体中则是在栈上

10.类模板的使用实际上是类模板实例化成一个具体的__________。
A 类
B 函数
C 模板类
D 对象

这个当然是实例化成具体的类!

编程题:

合法括号序列判断__牛客网

匹配不成功

  1. 当前字符不是括号字符
  2. 括号匹配不完整
    1️⃣多出了左半边:
    2️⃣多出了右半边:

解题思路:

  • 遍历字符串,遇到左括号就入栈,遇到右括号则查看栈中是否有对应的左括号
  • 若没有,栈为空,则表示多出了右括号,匹配不完整
  • 有,出栈,匹配一个完整的括号 遍历完毕后如果栈不为空,则是多出了左括号在这里插入图片描述

class Parenthesis
{
public:
	bool chkParenthesis(string A, int n)
	{
		stack<char> s;
		for (auto e : A)
		{
			switch (e)
			{
			case '('://左括号,压栈
				s.push(e);
				break;
			case ')':
				if (s.empty())//栈为空,说明右括号多了
					return false;

				s.pop();//栈不为空,去栈
				break;
			default://出现非括号字符
				return false;
				break;
			}
		}
		return s.empty();
	}
};

Fibonacci数列_牛客题霸_牛客网 (nowcoder.com)

在这里插入图片描述

 

题目思路:

  • 找到两个距离N最近的两个fib数
  • left(小于N),right(大于N)
  • 最近的距离是:min(N - left , right - N)
#include <iostream>

int main() {
    int f1 = 1, f2 = 0, f;
    int N, left=0, right=0;
    cin >> N;

    while(1)
    {
        f = f1 + f2;
        f2 = f1;
        f = f2;

        //通过不断循环找到了左边最小的fib数
        if(c < N)
        {
            left = f;//左边的fib数
        }
        else
        {
            right = f;//右边的fib数
            break;
        }
    }
   std::cout << std::min(N - left , right - N) <<std::endl;
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值