C++ 缺省参数

一、什么是缺省参数

缺省参数:是在函数声明或函数定义时为形参指定一个默认值,当调用函数时没有传入对应实参则将默认值做为实参传给形参

注意:函数声明与函数定义中不能同时定义缺省参数,下面代码为错误代码

void Print(int x = 10,int y = 20,int z = 30); // 函数声明

void Print(int x = 10,int y = 20,int z = 30); 
{
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "z = " << z << endl;
}

说明:

  1. 在函数声明与函数定义时都写缺省参数,极容易将两个地方默认值设置的不一致,导致编译器不知道以哪一个默认值为准,所以编译器直接不允许在两处同时写缺省参数
  2. 推荐将缺省参数写在函数声明处,一般调用其他人实现函数我们只需要看函数声明知道用法,而不会去看函数定义了解函数怎么实现

二、缺省参数定义

2.1 全缺省参数

全缺省参数:函数中每个形参都有对应默认值

#include <iostream>
using namespace std;

void Print(int x = 10,int y = 20,int z = 30); // 函数声明

void Print(int x,int y,int z)
{
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "z = " << z << endl;
}


int main()
{
	/*
		当实参个数少于形参时,实参从左到右依次赋值给形参,剩下形参使用默认值
	*/
	Print();
	cout << "-------------" << endl; 
	Print(1);
	cout << "-------------" << endl;
	Print(1, 2);
	cout << "-------------" << endl;
	Print(1, 2, 3);
	cout << "-------------" << endl;
	return 0;
}

输出:

x = 10
y = 20
z = 30
-------------
x = 1
y = 20
z = 30
-------------
x = 1
y = 2
z = 30
-------------
x = 1
y = 2
z = 3
-------------

2.2 半缺省参数

半缺省参数:函数中部分形参有对应默认值,半缺省参数必须从右到左给出,不能跳跃给

#include <iostream>
using namespace std;
// void Print(int x = 10, int y,int z = 30);   错误,形参z有默认值,形参x有默认值,形参y没有默认值,形成了跳跃
// void Print(int x = 10, int y,int z);  错误,半缺省参数必须从右到左给

void Print(int x, int y = 20,int z = 30); // 函数声明

void Print(int x, int y,int z) 
{
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "z = " << z << endl;
}

int main()
{
	Print(1);
	cout << "-------------" << endl;
	Print(1, 2);
	cout << "-------------" << endl;
	Print(1, 2, 3);
	cout << "-------------" << endl;
	return 0;
}

输出

x = 1
y = 20
z = 30
-------------
x = 1
y = 2
z = 30
-------------
x = 1
y = 2
z = 3
-------------

三、缺省参数与函数重载带来的二义性

使用缺省参数可以提高函数的易用性,但是当缺省参数与函数重载不恰当的结合会产生二义性,降低函数的清晰性

void Print(int x);
void Print(int x = 1,double y = 0.00);

void Print(int x)
{
	cout << "int" << endl;
}

void Print(int x,double y)
{
	cout << "int、double" << endl;
}

int main()
{
	Print(1, 0.0); // 正常调用Print(int x,double y)
	Print(); // 正常调用Print(int x,double y)
	Print(1); // 错误,对重载函数调用不明确,有二义性
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值