重载函数
1、定义:在同一个名字空间中存在两个或者多个具有相同名字的函数所构成的语法现象。
Note:
(1)调用重载函数的语句,是由编译器在编译期确定的。
(2)编译器判断某个函数调用语句所对应的重载函数时,判断依据是***函数参数的类型、个数和次序***。
(3)如果编译器无法判定,就会报告二义性错误。
带有默认参数值的函数
内联函数
1、普通函数调用:
函数调用时:参数及部分CPU寄存器的内容进栈,控制流跳转
函数返回时:返回值及寄存器值出栈,控制流跳转
2、目的:减小函数调用开销
3、方法:代码插入到调用处
4、结果:导致程序变大(因为要将内联函数展开)
编译器在遇到内联函数的调用时,会将内联函数的函数体展开到调用位置,从而避免函数调用的开销。
一般来说,内联函数只有在需要考虑程序运行性能的环境中才使用。
程序员所用的 inline 关键字,只是对编译器的一个请求。内联函数是否展开(程序过大会忽略inline关键字),是由编译器决定的。
5、定义内联函数:在函数前面加上关键字inline
// 定义内联函数
inline int max (int a, int b) {
return (a > b ? a : b);
}
// Calling (调用内联函数)
int x = max (3, 5);
int y = max (0, 8);
// Inline expansion(内联展开)
int x = (3 > 5 ? 3 : 5);
int y = (0 > 8 ? 0 : 8);
补充:
1、以下情况不宜用内联:
(1)如果函数体内的代码比较长,使得内联将导致内存消耗代价比较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
2、类中定义的函数为隐式内联函数,在函数名前加上inline定义为显示内联函数。
3、虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联。
原因:内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联。
#include <iostream>
using namespace std;
class Base
{
public:
inline virtual void who()
{
cout<< "I am Base"<<endl;
}
virtual ~Base(){}
};
class Derive: public Base
{
public:
inline void who()
{
cout<<"I am Derive"<<endl;
}
virtual ~Derive(){}
};
int main(void)
{
//此处虚函数who(),是通过Base具体对象b来确定的,编译期间就可以确定了,所以它可以是内联的,但最终是否内联取决于编译器
Base b;
b.who();
//此处的虚函数who(),是通过指针调用的,呈现多态性,运行期间才能确定,所以不能为内联。
Base *p = new Derive();
p->who();
delete p;
p = nullptr;
return 0;
}