前言
在做课设任务时产生的些许感悟。
课设任务名称:学生管理系统。
展示代码均已在VSCode中测试完成。
正文
1、函数参数中const和非const类型变量导致的函数适用范围区别;
在确保函数中不修改数值并且使用&修饰的函数参数中,若是涉及const值和非const值的传递,简单的修改则会扩大函数的适用范围。
例如代码如下,虽然max函数参数不一定要写成引用的形式,但是为了产生对比的感觉,所以我如此设计。
#include <bits/stdc++.h>
using namespace std;
int max_1(const int &a, const int &b)
{
return a > b ? a : b;
}
int max_2(int &a, int &b)
{
return a > b ? a : b;
}
int main()
{
int a = 1, b = 2;
const int c = 3, d = 4;
max_1(a, b);
max_1(c, d);
max_2(a, b);
// max_2(c, d);该语句错误
return 0;
}
在上述代码中,函数中不涉及函数参数数值上的修改,理论上const类型和非const类型的变量均可以使用,但是我觉得在实际应用上,const类型是最好不要传给非const类型的函数参数的,比如上述代码中涉及了引用,这意味着函数体内部代码可以产生对原数值的修改。不只是引用,传输给指针也能产生类似的效果。
若是确保函数内的代码不修改实际数值,const类型的变量往往比非const类型的变量具有更大的适用范围。
2、适用于结构体或类的函数,在函数参数的设计上也存在着技巧;
函数参数的简单修改能让函数代码不发生较大改变的情况下让函数的使用范围更加宽广。
在我们学到结构体或者类的时候,函数参数中难免会包含结构体或者类
#include <bits/stdc++.h>
using namespace std;
struct node
{
int num;
string name;
struct node *next;
};
class student
{
public:
struct node *head;
student() { head = nullptr ;}
~student();
};
student::~student(){
struct node *stup=head;
for(stup=stup->next;stup!=nullptr;stup=stup->next){
delete head;
head=stup;
}
}
void show_1(student &stu){
struct node *stup=nullptr;
for(stup=stu.head;stup!=nullptr;stup=stup->next){
cout<<"序号:"<<stup->num<<"姓名:"<<stup->name<<endl;
}
cout<<endl;
}
void show_2(struct node *head){
struct node *stup=nullptr;
for(stup=head;stup!=nullptr;stup=stup->next){
cout<<"序号:"<<stup->num<<"姓名:"<<stup->name<<endl;
}
cout<<endl;
}
int
main()
{
class student stu;
struct node *stup=nullptr;
for(int i=0;i<3;++i){
stup=new struct node;
stup->next=stu.head;
stu.head=stup;
cin>>stup->num>>stup->name;
}
show_1(stu);
show_2(stu.head);
return 0;
}
在上述的代码中,student类对象stu可以使用show_1和show_2函数,但是如果将show函数设计成show_1的类型,那么包含struct node这种结构体类型的链表就不能使用show函数。
但是若是把show函数设计成show_2函数的类型,包含struct node这种结构体类型的链表就能使用show函数了,简单的修改让函数没有改变它的实质内容,还进一步扩大了该函数的适用范围。
上文的max函数若是应用在结构体中,并且是那种只比较内部成员大小的简单应用,设计成普通的例如int类型的函数参数也同样会比直接使用结构体类型充当形参类型拥有更加广阔的应用范围。
举例:
int类型、double类型都是比较基础的类型,拥有着广阔的应用范围,若是一个结构体中包含int类型和double类型的成员,则相当于在两个广阔的应用范围之间取得了这个结构体所束缚的一个交集区域。
使用这一交集区域作为函数参数设计而成的函数自然就不会有着直接使用如int类型设计而成的函数拥有更加广阔的适用范围。