就像自习室占位置一样,先占着,需要传入指定类型的参数,同时这个指定类型的参数还可以有默认初始值。
C++函数形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置。
语法:
返回值类型 函数名(形参数据类型){}
实例代码,但是没什么用。
传入不同数据类型的参数,但是是同一个函数名。
能够指定参数名称传入吗?不能。
什么条件满足函数重载?①作用域相同,在全局空间内?还是在main函数中?若实现函数重载,需要在同一作用域中写。②函数名称必须相同。③形参有或没有,形参类型不同,形参顺序不同,形参个数不同,形参名称无所谓。满足这三点,可以称之为函数重载。
但是需要注意,函数重载不满足返回值|类型不同的情况,因为若函数形参个数,形参数据类型,形参顺序,函数体内部都相同,编译器不知道要执行哪个函数。所以函数重载不包括返回值|类型不同的情况。
以下是函数体重载的实验,包括①作用域不同的函数是否能够重载,②形参是否存在,③形参类型不同,④形参顺序不同,⑤形参个数不同。
①
此时,我发现一个问题,如果函数有默认参数,两个函数重载void OverLoad(int a =10)
与void OverLoad()
也不行,会报错。
代码示例:
//
// Created by 123 on 2024/1/27.
//
#include
#include
#include"BlackHorseFunctions.h"
using namespace std;
void OverLoad(){
cout<<"原函数"<<endl;
}
void OverLoad(int a, int b){
cout<<"OverLoad(int a, int b)--存在两个int形参的函数重载。"<<endl;
}
void OverLoad(int a , double b){
cout<<"OverLoad(int a , float b)--存在不同形参数据类型--int & float 的函数重载。"<<endl;
}
void OverLoad(double a , int b){
cout<<"OverLoad(float a , int b)--形参位置不同的函数重载。"<<endl;
}
void OverLoad(double a , int b , int c){
cout<<"OverLoad(float a , int b , int c)--不同形参个数的函数重载。"<<endl;
}
int main(){
system("chcp 65001");
OverLoad();
OverLoad(10,10);
OverLoad(3.14,10);
OverLoad(3,10.14);
OverLoad(3.14,3,10);
// system("pause");
return 0;
}
结果
D:\Program\C++C\BlackHorseStudy\cmake-build-debug\Section2Study.exe
Active code page: 65001
原函数
OverLoad(int a, int b)–存在两个int形参的函数重载。
OverLoad(float a , int b)–形参位置不同的函数重载。
OverLoad(int a , float b)–存在不同形参数据类型–int & float 的函数重载。
OverLoad(float a , int b , int c)–不同形参个数的函数重载。进程已结束,退出代码0
函数重载注意事项,第一项——默认参数问题上面已经提到过,不再赘述。重点说第二项,引用前+const也可以作为函数重载的条件——形参问题。
为什么?引用本质上是指针常量,意为内存中的一个变量用引用指向之后,内存中的变量值可以更改,但是该指针只能指向该变量,不能再指向其他内存地址了。那在前面加一个const意为此时指针常量指向的内存地址中的变量值也要变为常量。所以会有这样的语法出现const int &variable = 10;
此时,variable是一个指针,但却已经解引用了,而这样的语法则是不可以的int &uncan =10
,这是什么意思?意为一个指针指向了一个常量,但这个常量在内存空间中的哪里?不知道。所以,为什么加上const就行了?这是因为系统自动给该常量10(或其他任意常量)赋予了一个变量名,而这个变量名我们作为程序员是不知道的,只知道指向它的地址的指针名,并且这个指针还是解引用过后的,可以直接拿来加减乘除。
对应到函数重载中,也是如此,传入一个引用时,这个实参必须要初始化过。而若形参为const修饰的引用时,直接传入常量就行。以下为实验:
#include
#include
using namespace std;
void OverLoad(int &a){
cout<<"OverLoad(int &a)--传入普通的引用的函数重载。"<<endl;
}
void OverLoad(const int &a){
cout<<"OverLoad(int &a)--传入const修饰的的引用的函数重载。"<<endl;
}
int main(){
int a =10;
OverLoad(a);
OverLoad(10);
return 0;
}
运行结果:
D:\Program\C++C\BlackHorseStudy\cmake-build-debug\Section2Study.exe
Active code page: 65001
OverLoad(int &a)–传入普通的引用的函数重载。
OverLoad(int &a)–传入const修饰的的引用的函数重载。进程已结束,退出代码0