函数默认参数
函数栈
函数调用,是主调函数向被调函数传值,然后被调函数返回结果给主调函数的一个过程
这个过程是需要函数栈来辅助的
栈是向下生长的,就是由高地址向低地址开辟空间
堆是向上生长的,就是由低地址向高地址开辟空间
形参在入栈的时候是从右向左入栈的,而实参传值给形参的时候是从左向右传值(相当于出栈的顺序)
格式:返回值类型 函数的名字(形参=默认值){ }
#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; }
编译器无法仅根据返回值的类型来判断是否能够重载