波奇学C++:缺省参数,函数重载,引用
int add(int a,int b=1)
{return a+b;
}
int main()
{printf("%d",add(2));return 0;
}
3
如图,我们给有两个参数的函数只传了一个参数,依然可以运行起来原因是c++支持默认参数,和python一样,但没有python这么智能。表现在以下方面
1.当有多个参数时,从左往右
add(2,3)//a=2,b=3
2.不能指定传参,python可以指定传参
add(a=1,b=2);//报错
3.声明给缺省参数,定义不用给
int add(int a,int b=1);
int add(int a,int b)
{return a+b;
}
或者我们可以简单理解为函数调用先找声明,声明把缺省值传给函数定义
函数重载:函数可以接收不同类型的函数
int add(int a,int b)
{return a+b;
}
float add(float a,float b)
{return a+b;
}
add(1,2);//3
add(1.0,2.0);//3
为什么会c++支持函数重载?
代码编译以下流程:编译->汇编->链接
c和c++在汇编时产生符号表(简单理解为函数名以及函数地址),方便机器找到函数调用。
c++函数名被修饰,生成一个含有参数含义信息的函数名,因此机器可以通过参数信息找到对应的重名函数,精准调用,本质上两个不同的函数拥有同样的名字而已,而c没有修饰规则,所以只能有一个函数。
函数修饰规则能加入返回值信息吗?
目前不可以,因为在函数调用前,不知道函数的返回值信息,除非,已知函数返回值才能调用函数的规则。
python函数调自动识别参数类型,由此可推断有可能当一个函数被用户创建时,python可能产生复制很多个不同类型参数的函数。
引用:对指针的优化
void swap1(int*pa,int*pb)
{int cmp=*a;*a=*b;*b=cmp;
}
void swap2(int*&a,int*&b)
{int cmp=a;a=b;b=cmp;
}
int main()
{int a=0;int b=1;int& c=a;c=b;swap(&a,&b);swap2(a,b);return 0;
}
图中c和a指向同一个空间,类别python中列表名给另外变量,两个变量名都指向同一列表
有以下规则:1.引用不能为空,并且只能引用唯一变量
c=b;//c已经引用了a,c和a的地址都一样,这句代码无效
2.引用的类型是&前的类型,c和a都是int型
3.引用相当于拿到变量地址,再解引用,上述代码swap1()和swap2()是一样的。(让人有种形参改变实参的感觉。)