【这里只是记录一些比较容易忽略的知识点。】

内联函数

内联函数的出现,解决了两个技术问题。

1.当函数需要频繁调用,且函数体较短时,调用函数的开销(保存现场与返回地址)比函数本身的价值相比性价比不高。这时使用内联函数,直接把函数体嵌入到相应的代码位置,更有优势。

2.其实宏定义(#define)也可以解决1中的问题,但是宏定义往往在传递参数时会让人迷惑。不利于代码维护,阅读。内联函数能解决宏定义带来的不确定性。

内联函数的定义形式

inline 类型标示符 函数名(参数列表){函数体};

使用内联函数注意事项

对于一个函数来说,是否是内联函数,是由编译器决定的。如果我们在函数面前加上inline关键词,只是表示,建议该函数为内联函数。至于最终会不会成为内联函数嵌入到代码中,还是有编译器决定的。至于怎么决定,取决于以下几点。

1.内联函数不能有循环,和switch语句

2.内联函数不能是递归函数

总的来说,内联函数应该是短小简单的函数。对于编译器来说,它就是代码,如果过于复杂反而会造成代码膨胀,与函数的作用相反。PS:若写内联函数时不遵从以上的两点要求,编译仍然可以通过。但是编译器会将其转化为一般函数。

最后举个内联函数的栗子(仅供参考)

#include <iostream>
using namespace std;


inline void neilian()
{
  cout<<"nei lian han shu ";  
}

int main()
{
  neilian();
  return 0;  
}

 重载函数

编译器区分重载函数,是判断参数个数,以及参数类型进行的。与参数名,返回类型无关。

另外在调用函数之前,必须先声明函数原型。

下面是个小李子

#include <iostream>
using namespace std;

int main()
{
	int nihao(int& a);
	int nihao();
	nihao(2);
	nihao();
	getchar();
	return 0;
}

int nihao(int& a)
{
	cout<<"这是有参数的你好"<<endl;
	return 0;
}
int nihao()
{
	cout<<"这是没有参数的你好"<<endl;
	return 0;
}

其实重载函数真正实现的时候,你还是要写出具体的函数实现过程。只是相对于重新创造个新的函数来说,可以不用记住那么多函数名。并且,这样有利于函数接口的统一管理。如果出现了这种情况:现在要一个求绝对值的函数。我们发现,他们的逻辑是一样的,既先判断正负,若为正既输出,若为负取相反数输出。各种类型的数据都要有自己相应类型的函数,这时使用重载可以解决问题,但是有没有更好的解决方法呢?请看下面的函数模板。

函数模板

模板的定义方式

template <typename 标识符>

函数定义 

这是个小栗子

#include <iostream>
using namespace std;

template <typename T>
T modu(T a)
{
  return a<0?-a:a;
}

int main()
{
  int a = -2;
  float b = -1.5f;
  cout<<modu(a)<<endl;
  cout<<modu(b)<<endl;

  return 0;
}

 在需要某种函数的时候,编译器将自动根据模板生成该种函数。当然这种自动也可以变成“手动”。

还是上面小程序来做例子

 

//假如是double的时候,我要变成去绝对值之后+1。我就要用到手动具体化了
temlpate <>
double modu(double a)
{
  return (a<0?-a:a)+1.0;
}
//当使用double型数据时,将自动屏蔽之前的模板,而使用这个定义。其他数据类型则不变

 

PS:函数的重载与函数模板都是编译时多态的体现。

 

 

 

posted on 2012-12-23 14:56  曾健  阅读(355)  评论(0编辑  收藏  举报