【C++第二阶段】函数占位参数 & 函数重载

函数占位参数

就像自习室占位置一样,先占着,需要传入指定类型的参数,同时这个指定类型的参数还可以有默认初始值。

C++函数形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置。

语法:返回值类型 函数名(形参数据类型){}

实例代码,但是没什么用。

函数重载

传入不同数据类型的参数,但是是同一个函数名。

能够指定参数名称传入吗?不能。

什么条件满足函数重载?①作用域相同,在全局空间内?还是在main函数中?若实现函数重载,需要在同一作用域中写。②函数名称必须相同。③形参有或没有,形参类型不同,形参顺序不同,形参个数不同,形参名称无所谓。满足这三点,可以称之为函数重载。

但是需要注意,函数重载不满足返回值|类型不同的情况,因为若函数形参个数,形参数据类型,形参顺序,函数体内部都相同,编译器不知道要执行哪个函数。所以函数重载不包括返回值|类型不同的情况。

以下是函数体重载的实验,包括①作用域不同的函数是否能够重载,②形参是否存在,③形参类型不同,④形参顺序不同,⑤形参个数不同。

【C++第二阶段】函数占位参数 & 函数重载_第1张图片

此时,我发现一个问题,如果函数有默认参数,两个函数重载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

你可能感兴趣的:(C++学习与回顾,c++,visual,studio)