> 文章列表 > 波奇学C++:缺省参数,函数重载,引用

波奇学C++:缺省参数,函数重载,引用

波奇学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()是一样的。(让人有种形参改变实参的感觉。)