C++中函数默认参数与重载

函数默认参数

函数栈

函数调用,是主调函数向被调函数传值,然后被调函数返回结果给主调函数的一个过程

这个过程是需要函数栈来辅助的

栈是向下生长的,就是由高地址向低地址开辟空间

堆是向上生长的,就是由低地址向高地址开辟空间

形参在入栈的时候是从右向左入栈的,而实参传值给形参的时候是从左向右传值(相当于出栈的顺序)

格式:返回值类型 函数的名字(形参=默认值){ }

#include <iostream>
​
using namespace std;
int func(int a = 1, int b = 2, int c = 3) {//函数形参的默认参数
    cout << "你好" << endl;
}
int func1(int a = 1, int b, int c = 3) {
    cout << "OK" << endl;
}
int main() {
    func(3, 2, 1);
    //预期:30 20 10
    func1(2, 3);
    return 0;
}

剖析下上面程序的执行过程当函数执行到主函数func位置时,会由函数的调用,主调函数调用被调函数,被调函数会调用一个新的函数栈,被调函数的形参从右向左入栈,一次是c、b、a,然后主调函数向被调函数传值,按照从左到右的顺序传值

注意:如果某个位置有默认值,那么他的后面一般也要有默认值

原因:主函数中你认为值2会传给b但是实际上 他是按从左到右的顺序去传递的 2被赋值给了a b没有被赋值 所以会报错

#include <iostream>
​
using namespace std;
int func1(int a = 1, int b, int c = 3) {
    cout << "OK" << endl;
}
int main() {
​
    func1(2);
    return 0;
}

函数的重载

为什么C++有重载但是C语言却没有呐?

原因:C语言函数的组成与C++函数组成有区别

C中函数就是由函数名组成的

C++函数是由函数名+参数组成的

也就是说C++中参数不同但函数名相同的函数是不同的函数,而C语言里只要函数名一样就是相同函数了

所以C语言中不纯在函数的重载

函数重载的作用

函数名可以相同,提高复用性

在调用相同函数名的函数的时候,通过参数列表的不同来却分到底进入哪个函数

参数列表的不同可以是参数个位的不同,参数顺序的不同,参数类型的不同等等

#include <iostream>
​
using namespace std;
void fun(int a, int b) {
    cout << 1 << endl;
}
void fun(int a, float b) {
    cout << 2 << endl;
}
void fun(double a) {
    cout << 3 << endl;
}
void fun(float a) {
    cout << 4 << endl;
}
int fun(int a, double b) {
    return 5;
}
//int fun(float a) {
//  cout << 5 << endl;
//}//报错了 因为函数的重载就函数名相同参数不同 返回值对函数重载的判断不起作用
void fun(int a, int b, int c) {
    cout << 5 << endl;
}
int main() {
    fun(1, 1);
    fun(1, 1.1f);
    cout << fun(1, 1.1)<<endl;
    fun(1.1);
    fun(1.1f);
    return 0;
}

当引用作为函数重载的条件

#include <iostream>
​
using namespace std;
void func(int &b) {
    cout << "1" << endl;
}
void func(const int &b) {
    cout << "2" << endl;
}
void func(int&& b) {
    cout << "3" << endl;
}
int main() {
    int a = 2;
    func(a);
    func(2);
    return 0;
}

引用分为左值引用 右值引用 和 万能引用

可以用这个来作为函数参数的不同

函数重载遇到函数默认参数

观看下面的示例,确实符合函数重载的定义(函数名相同,参数列表不同可以重载),但是仔细观察第一个函数是有一个默认参数的,理论上它传递2个值就可以。而第二个函数就是传递俩个参数,这就会造成编译器无法确定你到底要将这俩个值传递给谁

#include <iostream>
​
using namespace std;
void func(int a,int b,int c=1) {
    cout << "1" << endl;
}
void func(int a,int b) {
    cout << "2" << endl;
}
int main() {
    func(1,2);
    return 0;
}

一个函数是否能够重载与它的返回值无关

#include <iostream>
​
using namespace std;
void func(int a, int b) {
    cout << "1"<<endl;
}
int func(int a, int b) {
    cout << "2" << endl;
}
int main() {
    func(1, 1);
    return 0;
}

编译器无法仅根据返回值的类型来判断是否能够重载

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值