1.引言
在一段学习了一段时间的C++后,我感受颇深。今天继上一篇文章,今天我们一起继续来学习C++入门语法。今天学习的内容:①缺省参数②函数重载③引用④内联函数⑤auto关键字
2.缺省参数
2.1什么是缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参。那么是什么意思呢,我们来看下面的代码与输出结果。
#include<iostream>
using namespace std;
void fun1(int a = 0)
{
cout << a << endl;
}
int main()
{
fun1();
fun1(1);
return 0;
}
我们这里看到,第一次调用fun1输出是0,第二次调用的输出是1。那么为什么输出结果是这个呢?我这里解释一下:这个缺省函数就是一个备胎,当我们没有给它传参数的时候,函数调用的时候就使用这个缺省值,但如果传了参数,那么它就不管备胎了,就使用传的这个参数。
2.2.缺省参数的分类
缺省参数分为两类,一类是全缺省,另一类是半缺省。顾名思义,全缺省就是全部参数都给了缺省值,而半缺省只给了部分缺省值。
void Func(int a, int b = 10, int c = 20)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
比如这个函数,就是半缺省参数,缺省值必须从右往左给,以为我们传值的时候是从左往右传。
3.函数重载
3.1.什么重载
先举个栗子:在我这个等级,谁都不怕。这句话有两种理解,一种是任何人都不惧怕我,另一种是我不惧怕任何人。类似于这样子一词多义就可以认为一个重载。
int Add(int a,int b)
{
return a+b;
}
double Add(double a,double b)
{
return a+b;
}
int main()
{
int a=1,b=2;
double c=1.1,d=2.2;
cout<<Add(a,b)<<endl;
cout<<Add(c,d)<<endl;
return 0;
}
如上代码,这两个Add就构成函数重载。 下面在调用的时候会找到匹配的类型进行调用,比如a,b就是调用第一个Add;c,d就是调用第二个Add。
3.2怎么实现的?
在C语言编译阶段,会把调用函数编译成一个call指令,在C语言中,这两个函数都会被编译成call xxxxxxAddxxx(这里的x是其他字符),所以C语言没有重载的概念,但是在C++中,这两个函数会被分别编译成: call xxxxiAddiixxx 和 call xxxxxdAddddxxx 所以就可以实现两个函数的不同调用。
4.引用
土豆你个马铃薯,在日常生活中土豆也可以称作马铃薯,番茄也可以叫作西红柿。正如马铃薯、西红柿,这些都是别名,指代的东西是同一个东西。在C++中也有类似的别名:引用。
int main()
{
int a = 0;
int b& = a;
int b = 2;
cout<<a<<endl;
return 0;
}
如上代码,最终输出的结果是2。因为这个b是a的别名,对b操作实际上是对a进行操作。比如说你家里有一个番茄,你切了半个西红柿去抄饭,那么你就剩半个番茄。这个引用如同C语言的地址一样,权限只能缩小不能放大。
int main()
{
const int a = 0;
int b& = a;
const int c& = a;
return 0;
}
如上面的代码,这里的b引用就是失败的,因为它将const变成了常量,这是不被允许的,但是下面的c就是const int 没有改变权限,所以可以引用。
5.auto关键字
auto关键字就是C++的一块语法糖,这个关键字可以根据右值自动得出数据类型。可以大大方便我们编程。比如:
int main()
{
int a[10]={0};
for(auto e&:a)
e=1;
for(auto e&:a)
cout<<e<<" ";
cout<<endl;
return 0;
}
这样子就可以对数组进行赋值或打印,当然这个也只是缩短了一点点代码长度,看得不太明显。我们举一个后面一点的栗子:
//这里我们需要取迭代器的list的begin节点。
//正常写法
list::iterator<int> it = v.begin();
//auto写法
auto it =v.begin();
如果我们需要大量用到begin节点,那么auto绝对可以节省大量的时间,方便我们的编程
6.结语
C++入门到这里就结束啦,有什么问题或者错误欢迎评论区讨论呀