C++的函数Plus

函数新参的默认值

在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

这里复习了函数的一些高级用法,包括函数的形参,函数的重载等知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值