一、选择题
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,因为成员函数有隐藏的this指针
- 重载成类的友元函数必须有一个参数要是类类型的对象
题目中说一个参数都没有故重载错误选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;
}
运行结果: