(10.1)函数的设计之函数的默认参数

1.函数的默认参数

  • C++允许在函数定义或函数声明时, 为形参指定默认值 (一定是形参), 这样的参数称为默认参数(default argument) , 一般形式为:
返回类型 函数名(...,类型 默认参数名=默认值)
{ 
	函数体
}

eg:
int add(int x=5,int y=6)
{
	return x+y;
}
int main()
{ 
	add(10,20); //10+20
	add(10); //10+6
	add(); //5+6,两个参数都是默认的值
	return 0}
  • (1) 如果在函数定义时设置了默认参数, 那么就不能在函数声明中再次设置, 反之亦然。
    声明和定义时候,默认参数只能设置一次
int volume(int L, int W , int H=1);
int volume(int L, int W , int H=1)
//定义再次设置, 错误
{
	return length * width * height;
}

int volume(int L, int W , int H=1);
int volume(int L, int W , int H) // 正确
{
	return length * width * height;
}
  • (2) 可以设置多个默认参数, 设置的顺序为自右向左,
    换言之,要为某个参数设置默认值, 则它右边的所有参数必须都是默认参数。
int volume(int L, int W , int H=1);
//H为默认参数, 正确

int volume(int L, int W=1 , int H=1);
//W,H为默认参数, 正确

int volume(int L=1, int W=1 , int H=1);
//L,W,H为默认参数, 正确

int volume(int L=1, int W , int H); // 错误
int volume(int L, int W=1 , int H); // 错误
  • (3)默认值可以是常量、 全局变量, 甚至是一个函数调用(调用实参必须是常量或全局变量的表达式) , 不可以是局部变量。
//全局变量p1,p2
int p1=2 , p2=10 ;
int max(int a,int b)
{
	return a>b ? a : b;
}

int volume(int L, int W , int H=1); //允许常量
int volume(int L, int W , int H=p1+p2);
//允许全局变量及表达式

int volume(int L, int W , int H=max(5,6));
//允许函数调用

int volume(int L, int W , int H=max(p1,p2))
//允许全局变量函数调用

2.默认参数函数的调用

  • 默认参数本质上是编译器根据函数声明或函数定义时的默认参数设置, 对函数调用中没有给出来的实参自动用默认值表达式“补齐”再进行编译。
  • eg:
#include <iostream>
using namespace std;
int p1=2 , p2=10 ;
int max(int a,int b)
{ 
	return a>b ? a : b; 
}
int volume(int L=1, int W=p1+p2 , int H=max(p1,p2))
{
	return L * W * H ;
}
int main()
{
	cout << "v0=" << volume() <<endl;
	cout << "v1=" << volume(5) <<endl;//传给L=5
	cout << "v2=" << volume(5,10) <<endl;//传给L=5,W=10
	cout<<"v3="<<volume(5,10,15) <<endl;
	return 0;
}

2.函数重载

  • 函数重载(function overloading) 是在同一个域中用同一个函数名来定义多个函数, 但函数参数列表应彼此有不同, 或者是参数个数不同, 或者是参数类型不同, 或者两者均有不同。
    eg:OS能够自动的选择
//形参类型不同
int add(int a, int b);
double add(double a, double b);

//形参个数不同
int add(int a, int b);
int add(int a, int b, int c);
  • eg:
 #include <iostream>
 using namespace std;
 int max(int a, int b) //整型版本
 {
 	return (a>b ? a : b);
 }
 double max(double a, double b) //双精度版本
 {
 	return (a>b ? a : b);
 }
 long max(long a, long b) //长整型版本
 {
 	return (a>b ? a : b);
 }


 int main()
 {
	 int i=12 , j=-12 , k;
	 k = max(i,j) ; //调用整型版本max
	 cout << "int max=" << k << endl;
	 double x=123.4 , y=65.43 , z;
	 z = max(x,y) ; //调用双精度版本max
	 cout << "double max=" << z << endl;
	 long a=7654321 , b=1234567, c;
	 c = max(a,b) ; //调用长整型版本max
	 cout << "long max=" << c << endl;
	 return 0;
 }
  • eg:
 #include <iostream>
 using namespace std;
 int max(int a, int b) //两个参数版本
 { 
 	return (a>b ? a : b); 
 }
 int max(int a, int b, int c) //三个参数版本
 { 
 	a = a>b ? a : b ; 
 	a = a>c ? a : c ;
 	return (a);
 }
 int main()
 {
	 int a , b, i=10, j=8 , k=12;
	 a = max(i,j) ; //调用两个参数版本max
	 b = max(i,j,k) ; //调用三个参数版本max
	 return 0;
 }
  • 函数重载的说明:
    (1) 重载函数的形参必须不同(个数不同或类型不同) 。
    (2) 编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。
    (3) 不要将不同功能的函数声明为重载函数, 以免出现调用结果的误解、 混淆。
发布了556 篇原创文章 · 获赞 140 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/104162311