C++中函数可以拓展出默认参数、占位参数和重载,其中重载在C++中具有重要意义。
一、函数默认参数
C++中函数形参可以有默认值,但要遵守一定规则。如果某个位置参数有默认值,那么从这个位置往后都必须有默认值。如果函数声明中有默认值,函数实现的时候就不能有默认参数。
最好将默认值设置在函数声明中,避免跨文件调用时报错。
//add1.h
#include<iostream>
using namespace std;
int add1(int x, int y, int z);
//add1.cpp
#include"add1.h"
int add1(int x, int y = 2, int z = 3)
{
return x + y + z;
}
//add2.h
#include<iostream>
using namespace std;
int add2(int x, int y = 2, int z = 3);
//add2.cpp
#include"add2.h"
int add2(int x, int y, int z)
{
return x + y + z;
}
//main.cpp
#include"add1.h"
#include"add2.h"
int main()
{
//此处会显示“函数调用的参数太少”
//cout << "sum = " << add1(1) << endl;
cout << " sum = " << add1(10, 20, 30) << endl << endl;
cout << " sum = " << add2(1) << endl;
cout << " sum = " << add2(10, 20, 30) << endl;
return 0;
}
二、函数占位参数
函数的形参列表里可以有占位参数,对其仅设置数据类型而不赋予形参名,但在调用函数时该位置必须有实参。
占位参数也可以设置默认值,若其有默认值,则调用函数时该位置可以无实参。
三、函数重载
函数名可以相同,提高复用性。
1.函数重载条件
即区分函数名相同函数的条件,可以是函数参数类型、个数或顺序不同。函数返回值类型不同不可以作为函数重载条件。
void func(int a)
{
cout << " func (int a) 的调用" << endl;
}
void func(double a)
{
cout << " func (double a)的调用" << endl;
}
void func(int a, double b)
{
cout << " func (int a ,double b) 的调用" << endl;
}
//二者在被调用时没有区别,会造成歧义,会报错“无法重载仅按返回类型区分的函数”
void func(double a, int b)
{
cout << " func (double a ,int b)的调用" << endl;
}
//int func(double a, int b)
//{
// cout << "func (double a ,int b)的调用" << endl;
// return 1;
//}
int main()
{
func(10);
func(3.14);
func(10, 3.14);
func(3.14, 10);
return 0;
}
2.函数重载与引用
引用和常量引用也可以作为函数重载条件。
//若用func(x)调用该函数,即为“int& a = x;”,合法
//若用func(1)调用该函数,即为“int& a = 1;”,不合法
void func(int& a)
{
cout << "func (int &a) 调用 " << endl;
}
//用func(x)和func(1)调用该函数,即“const int& a = x;”和“const int& a = 1;”,均合法
void func(const int& a)
{
cout << "func (const int &a) 调用 " << endl;
}
int main()
{
int x = 1;
//func(x)优先调用函数func(int& a),当不存在函数func(int& a)时,调用函数func(const int& a)
//func(1)只能调用函数func(const int& a)
func(x);
func(1);
return 0;
}
3.函数重载和默认参数
若要使某函数重载,则尽量不要给该函数设置默认参数。
void func(int a, int b = 2)
{
cout << "func(int a, int b = 2) 调用" << endl;
}
void func(int a)
{
cout << "func(int a) 调用" << endl;
}
int main()
{
//该行代码可正常执行,无歧义,只有函数func(int a, int b = 2)可被其调用
func(1, 2);
//该行代码无法正常执行,有歧义,函数func(int a)和函数func(int a, int b = 2)均可被其调用
//报错显示“有多个重载函数func实例与参数列表匹配”
//func(1);
return 0;
}