函数的默认值参数
C语言中没有带默认值的函数,C++支持带默认值的函数
1.默认值的传入过程
在函数调用点,如果没有传递全部的实参,则会默认传递默认值作为实参。
2.默认值的赋值
必须从右向左,依次赋值。
默认值只在本文件有效。
参数默认值在同一作用域下只允许赋值一次,给多次相同的默认值也不可以
#include<iostream>
using namespace std;
int sum(int a = 10, int b = 20, int c = 30)
{
return a + b + c;
}
int main()
{
int a = 1, b = 2, c = 3;
cout << sum(a,b,c) << endl;
cout << sum(c) << endl;
return 0;
}
由该程序可以看出,如果变量被赋初值,那么默认值就将不会再被赋给变量,并且赋初值是按照从右向左的顺序赋给变量的。
内联函数(inline)
1.内联函数的定义
在函数定义处加上inline关键字
2.内联函数在函数调用点展开(编译过程)
3.内联函数不生成符号,仅可以在本文件可见
4.如果想在其他文件使用该内联函数,可以在函数定义处加上extern关键字(不推荐)。最好将内联函数写在.h中
5.inline函数只在release版本中起作用。在debug版本中,inline函数的调用也是需要栈帧的开辟和回退(主要是为了方便调试)。而且inline只是对编译器的一个建议,最终是由编译器来决定是否处理成内联。递归的函数不能处理成内联。
我们在main.cpp中写了一个函数sum,在main1.cpp中用了这个函数,可以看出编译连接过程没问题,答案也没问题。
但如果在sum函数定义处加上inline关键字,你就会发现系统报了一个“无法解析外部符号”的错误。
这是因为内联函数在调用点展开,不产生外部符号,只在本文件可见,在另一个文件不能通过在链接阶段声明定位到另一个文件中的内联函数,所以内联函数一般可以写在头文件中。
1.内联函数和普通函数的区别?
1.内联函数没有标准的函数栈帧的开辟和回退,而普通函数有。
所以函数过于短时,一般处理成内联函数,当调用函数的开销(栈帧的开辟和回退)大于函数执行的开销时,用内联函数可以省去调用函数的开销。
2.内联函数不产生符号。
2.内联函数和static函数的区别?
1.都是文件可见(作用域)
2.栈帧的开辟和回退不一样。调用static函数时有正常的栈帧开辟和回退,和普通函数一样。
3.static函数产生符号local。
3.static函数和普通函数的区别?
1.static函数产生的符号是local的,链接器不处理
2.普通函数产生global符号
4.inline函数和宏的区别?
1.都是本文件可见
2.都不产生符号
3.宏在函数调用点展开(预编译期),inline函数在编译期展开
4.宏函数没有类型检查,无法调试,inline函数有类型检查,可以调试
5.inline函数不一定会处理为调用点展开(指针函数)
因此,内联函数相当于一种更安全的宏,因为在预处理阶段不进行检查,只是进行替换,而编译阶段会进行类型检查,所以更安全。有内联函数后,尽量不使用宏,因为用宏写的代码无法调试,也没有类型检查。
函数的重载
在C语言中,函数产生符号是由函数名来决定的;
在C++中,函数产生符号,是由函数名称+函数的参数列表(类型和个数函数)来决定的。
(1)函数名相同,参数列表不同的一组函数称作一组重载的函数。
(不能仅通过返回值的不同来进行重载,因为函数符号的产生和返回值没关系)
(2)重载必须处于同一个作用域之内
在C和C++中,全局和局部作用域可以定义同名的函数,在局部使用时,优先使用局部的。
C和C++允许不同的作用域产生相同名的符号
(3)对实参的值是否有影响
const/volatile 所修饰的指针或者引用可以作为函数重载的前提条件。