C++笔试强训8


一、选择题

1-5题

在这里插入图片描述
根据下面的定义故选A。

函数重载:在相同作用域中,函数名字相同,参数列表不同的一系列函数称为函数重载参数列表不同具体的体现:参数个数不同参数类型不同类型的次序不同注意:与函数返回值类型是否相同没有关系


在这里插入图片描述
A:正确,引用必须初始化,而指针可以不必
B:引用初始化后就不能被改变比如
int a=0,b=5;
int& c=a;
c=b;
此处c=b只是把c的值修改成了5而已,c还是a的别名。,指针可以改变所指对象,正确。
C:引用在定义的时候就必须初始化,所以不存在空值,指针可以赋值NULL或nullptr。
D:引用的概念,正确
E:引用底层也是指针,所以此处引用传值是错误的。
F:正确

故选E。

如果对引用不太懂,可以点击下方超链接去阅读一下我有关引用的一片博客。

引用详解
在这里插入图片描述


在这里插入图片描述
public的类成员是可以被外部访问的,protected和private修饰的成员都不能被外部访问,故选C。


在这里插入图片描述
本题让补充一个构造函数,成员变量是一个int类型的指针p,然后调用show函数返回*p之后是个5,说明我们要给p来new一块内存,并把5存进去,p=new int(x)符合题意,故选B。


在这里插入图片描述
补充一下拷贝构造的概念

概念:是一个特殊的构造函数,是单参的,参数类型必须是类类型的引用,一般情况下会使用const来修饰例如: A(const A& a)
调用时机,当用已经存在的对象构造新对象时,编译器会自动调用拷贝构造函数

//场景
A a1;
A a2(a1);  //拷贝构造
A a3=a1; //拷贝构造
void Func(A a)//传参也会调用拷贝构造
A func()
{
	A a;
	return a;
}
 //返回值也会调用拷贝构造

值得注意的是
A a1;
A a3=a1;这种调用的是拷贝构造,因为是用已经存在的对象构造新对象

A a4;
A a5;
a5=a4;这种调用的是复制重载,因为a5不是新对象

综上故选B。


6-10题

在这里插入图片描述
左图不考虑编译器优化是9次,右图考虑编译器会在返回值那里进行优化,会变成7次,只能选D。
在这里插入图片描述


在这里插入图片描述
当用户定义了一个类之后,然后想要通过该类的对象直接使用某种运算符—编译器不支持
原因:类对象中可能有多个成员在用该类的对应进行相应的运算符操作时该如何处理编译器是不知道的
比如:Date
d1 -d2 或者 d1<d21.

运算符重载:

  1. 重载成类的成员函数—形参数目看起来比该运算符需要的参数个数少1,因为成员函数有隐藏的this指针
  2. 重载成类的友元函数必须有一个参数要是类类型的对象

题目中说一个参数都没有故重载错误选D。


在这里插入图片描述
C++中秉持先构造的后析构,后构造的先析构原则

故题中构造顺序是a,b则析构顺序为b,a
故a构造,b构造,b析构,a析构
故选D。


在这里插入图片描述
类里有个静态成员变量,构造函数中++了一次,析构函数中–的一次,故值不变,又因为静态成员变量是属于类的,故对象释放该静态成员变量依旧存在,故值不变还是0‘故选D。


在这里插入图片描述
这个应该天天听说吧,C++得手动管理内存,不像java那样就垃圾回收机制。
故C错误选C。


二、编程题

题目一

题目链接:
两种排序方法
在这里插入图片描述

提交代码:

#include <iostream>
#include<vector>
#include<string>
using namespace std;

int main() {
    vector<string> arr;
    int number;
    cin >> number;
    arr.resize(number);
    for (int i = 0; i < number; i++) {
        cin >> arr[i];
    }
    bool a = true, b = true;
    for (int i = 0; i < number - 1; i++) {
        if (arr[i] < arr[i + 1]) {
            continue;
        } else {
            a = false;
            break;
        }
    }
    for (int i = 0; i < number - 1; i++) {
        if (arr[i].size() < arr[i + 1].size()) {
            continue;
        } else {
            b = false;
            break;
        }
    }
    if (a == true && b == true) {
        cout << "both";
    } else if (a == false && b == true) {
        cout << "lengths";
    } else if (a == true && b == false) {
        cout << "lexicographically";
    } else {
        cout << "none";
    }
}
// 64 位输出请用 printf("%lld")

运行结果:

在这里插入图片描述


题目二

题目链接:
求最小公倍数
在这里插入图片描述

提交代码:

#include <iostream>
using namespace std;
int gcd(int a, int b) {
    int r;
    while (r = a % b) {
        a = b;
        b = r;
    }
    return b;

}
int main() {
    int a, b;
    while (cin >> a >> b) {
        cout << a* b / gcd(a, b) << endl;
    }
    return 0;
}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

争不过朝夕,又念着往昔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值