【这里只是记录一些比较容易忽略的知识点。】
内联函数
内联函数的出现,解决了两个技术问题。
1.当函数需要频繁调用,且函数体较短时,调用函数的开销(保存现场与返回地址)比函数本身的价值相比性价比不高。这时使用内联函数,直接把函数体嵌入到相应的代码位置,更有优势。
2.其实宏定义(#define)也可以解决1中的问题,但是宏定义往往在传递参数时会让人迷惑。不利于代码维护,阅读。内联函数能解决宏定义带来的不确定性。
内联函数的定义形式
inline 类型标示符 函数名(参数列表){函数体};
使用内联函数注意事项
对于一个函数来说,是否是内联函数,是由编译器决定的。如果我们在函数面前加上inline关键词,只是表示,建议该函数为内联函数。至于最终会不会成为内联函数嵌入到代码中,还是有编译器决定的。至于怎么决定,取决于以下几点。
1.内联函数不能有循环,和switch语句
2.内联函数不能是递归函数
总的来说,内联函数应该是短小简单的函数。对于编译器来说,它就是代码,如果过于复杂反而会造成代码膨胀,与函数的作用相反。PS:若写内联函数时不遵从以上的两点要求,编译仍然可以通过。但是编译器会将其转化为一般函数。
最后举个内联函数的栗子(仅供参考)
#includeusing namespace std;inline void neilian(){ cout<<"nei lian han shu "; }int main(){ neilian(); return 0; }
重载函数
编译器区分重载函数,是判断参数个数,以及参数类型进行的。与参数名,返回类型无关。
另外在调用函数之前,必须先声明函数原型。
下面是个小李子
#includeusing namespace std;int main(){ int nihao(int& a); int nihao(); nihao(2); nihao(); getchar(); return 0;}int nihao(int& a){ cout<<"这是有参数的你好"<
其实重载函数真正实现的时候,你还是要写出具体的函数实现过程。只是相对于重新创造个新的函数来说,可以不用记住那么多函数名。并且,这样有利于函数接口的统一管理。如果出现了这种情况:现在要一个求绝对值的函数。我们发现,他们的逻辑是一样的,既先判断正负,若为正既输出,若为负取相反数输出。各种类型的数据都要有自己相应类型的函数,这时使用重载可以解决问题,但是有没有更好的解决方法呢?请看下面的函数模板。
函数模板
模板的定义方式
template <typename 标识符>
函数定义
这是个小栗子
#includeusing namespace std;template T modu(T a){ return a<0?-a:a;}int main(){ int a = -2; float b = -1.5f; cout< <
在需要某种函数的时候,编译器将自动根据模板生成该种函数。当然这种自动也可以变成“手动”。
还是上面小程序来做例子
//假如是double的时候,我要变成去绝对值之后+1。我就要用到手动具体化了temlpate <>double modu(double a){ return (a<0?-a:a)+1.0;} //当使用double型数据时,将自动屏蔽之前的模板,而使用这个定义。其他数据类型则不变
PS:函数的重载与函数模板都是编译时多态的体现。