函数新参的默认值
在C++中,函数的新参列表时可以有默认值的,其语法是:返回值类型 函数名(参数=默认值){}
#include <iostream>
using namespace std;
//在c++中,函数的形参列表是可以有默认值的
//语法是:返回值类型 函数名(参数=默认值){}
int func(int a=10,int b=20,int c=30) {
return a+b+c ;
}
int main() {
int sum = func();
cout << sum << endl;
return 0;
}
函数形参的规则有这三点。一是如果某一个位置有了默认的参数,那么这个位置往后,自左往右所有的参数都必须有参数。二是如果函数的声明有默认参数,函数实现就不能够有默认参数,也就是说函数的声明处和函数头的阐述列表中,只能一处有默认参数。三是如果给了设有默认值的形参一个参数,那么默认值就会被取代。
#include<iostream>
using namespace std;
int func(int a=10,int b=20){
return a+b;
}
int func2(int a=10,int b=20);
int func2(int a,int b){
return a+b;
}
//int func3(int a=10,int b=20); 和下面的形参列表矛盾
int func3(int a=5,int b=3){
return a+b;
}
// int func4(int a=30,int b,int c){
// return a+b+c;
// }
int main(){
//第三点特点
cout<<func()<<endl;
cout<<func(5,3)<<endl;
//第二点特点
cout<<func2()<<endl;
cout<<func3()<<endl;
//第一点特点
//cout<<func4()<<endl;
return 0;
}
函数的占位参数
#include<iostream>
using namespace std;
//c++中函数的形参列表可以有占位参数,
// 用来做占位、调用函数是必须填补该位置
//语法: 返回值类型 函数名(数据类型){}
int func1(int = 10,int a=9) {
//目前阶段,占位参数即使有对应的实参传递值给它
//但是由于我们没有给它命名,无法使用它
//所以似乎没有什么作用
//但是在涉及了类这个东西的时候,占位参数就有了很重要的作用
return a;
}
int main() {
cout << func1(5) << endl;
return 0;
}
函数的重载
函数的重载是指通过一些条件让一些函数做到名字一样,但是编译器可以知道调用具体的那个函数,具体的实现参见下面代码以及注释。
#include<iostream>
using namespace std;
//函数重载的作用:函数名可以相同,提高复用性
//函数重载满足的条件
//1、同一个作用域下 (函数定义,全局定义)
//2、函数名称相同
//3、函数参数的 类型不同 或者 个数不同 或者 顺序不同
//注意:函数的返回值不可以做为函数重载的条件
void func(int a,int b) {
cout << "This is test 1" << endl;
}
void func(int c,char d) {
cout << "This is test 2" << endl;
}
void func(char e, int f) {
cout << "This is test 3" << endl;
}
int main() {
func(4, 3);
func(3,'5');
func('*', 3);
return 0;
}
函数重载的注意事项
发生函数重载时需要有两点值得注意,一是引用作为重载条件,二是函数重重在的时候碰到了默认参数
#include<iostream>
using namespace std;
//1、引用作为重载条件
void fun(int &a) {
cout << "function_fun's leading" << endl;
cout << "no const" << endl;
}
void fun(const int& a) {
cout << "function_fun's const leading" << endl;
cout << "have const" << endl;
}
int main() {
int a = 10;
fun(a);
fun(10);
//这里的实参是10,而int &a=10是由语法问题的,
// 因为引用必须对应到由对应的内存空间
//诸如int &a=b才是对的 即引用的必须是一块内存空间
//而对于const int &a=10;是符合语法规则的
//编译器会默认这样
//int temp=10;
//int &a=temp;
return 0;
}
第一次是调用的no const的函数
对于 fun(a)
这样的调用,其中 a
是一个 int
类型的变量(int a = 10;
),编译器在进行函数重载决议时,会优先选择非 const
引用的版本(也就是 void fun(int &a)
这个函数)。
原因在于,当传递一个可修改的左值(像这里的变量 a
就是一个可修改的左值,左值表示它在内存中有确定的存储位置并且可以被赋值等操作)时,编译器会优先尝试匹配非 const
引用的参数形式,因为这样的匹配更符合参数传递的精确性要求,它允许函数内部通过这个引用去修改实参所对应的变量。
第二次调用的have const的函数介绍如代码注释
#include<iostream>
using namespace std;
//2、函数重载的时候碰到默认参数
void func2(int a,int =30) {
cout << "this is func2----------1" << endl;
}
void func2(int a) {
cout << "this is func2-------2" << endl;
}
int main(){
func2(10);
//为了避免出现这样的问题:
// 即就是重名的两个函数中,一个的参数个数相较于另一个多了默认值参数
//不要设置默认值
return 0;
}
对于func2的调用,感兴趣的读者可以区看看。如果我们只放一个参数进去做实参的话,是会报错的。而不是如我们所期待的那样调用第二个函数。正如代码注释中说的,我们不要设置占位参数的默认值,无论传入的参数是一个还是两个,都会调用到相应的函数。
Summary
这里复习了函数的一些高级用法,包括函数的形参,函数的重载等知识。