1、函数的声明与定义的区别
函数的声明与函数的定义形式上十分相似,但是二者有着本质上的不同。声明是不开辟内存的,仅仅告诉编译器,要声明的部分存在,要预留一点空间。定义则需要开辟内存。
(1)函数的定义:
函数的定义是一个完整的函数单元:包含函数类型、函数名、形参及形参类型、函数体等
在程序中,函数的定义只能有一次
函数首部与花括号间不加分号
(2)函数的声明:
函数声明只是对编译系统的一个说明:函数声明是对定义的函数的返回值的类型说明,以通知系统在本函数中所调用的函数是什么类型。
不包含函数体(或形参)
调用几次该函数就应在各个主调函数中做相应声明
函数声明是一个说明语句,必须以分号结束!
不包含函数体(或形参)
调用几次该函数就应在各个主调函数中做相应声明
函数声明是一个说明语句,必须以分号结束!
2、内联函数
内联函数是通过在编译时将函数体代码插入到函数调用处,将调用函数的方式改为顺序执行方式来节省程序执行的时间开销。
内联函数是一种用空间来换时间的方案。
定义在前,使用在后。定义时只需在函数定义的前面加上关键字inline。
例子:
#include <iostream> using namespace std; inline double CirArea(double radius) { return 3.14 *radius * radius; } int main() { double r1(1.0),r2(2); cout<<CirArea(r1)<<endl; cout<<CirArea(r1+r2)<<endl; return 0; }
3、函数重载
同一个函数名可以对应着多个函数的实现,这些函数名是相同的,但它们呢度形参个数和类型却不同,编译器根据它们各自的实参和形参的类型以及参数个数进行最佳匹配,自动决定用哪个函数体。
例子:
#include <iostream> using namespace std; //两个都是int类型 int add(int x,int y) { cout<<"(int,int) "; return x+y; } //两个都是double类型 double add(double x,double y) { cout<<"(double,double) "; return x+y; } //x为int类型,y为double类型 int add(int x,double y) { cout<<"(int,double) "; return x+y; } //x为double类型,y为int类型 double add(double x,int y) { cout<<"(double,int) "; return x+y; } //调用 int main() { cout<<add(2,3)<<endl; cout<<add(2.0,3.0)<<endl; cout<<add(2,3.0)<<endl; cout<<add(2.0,3)<<endl; return 0; }
4、函数模板
使用函数时,如果采用重载函数,也只是使用相同的函数名(上例中的add()函数),函数体仍然要分别定义。函数模板可以创建一个通用功能的函数,来支持多种不同形参,进一步简化重载函数的函数体设计。
注:template关键字表明的是模板;
class是类型关键字,也可用typename作为关键字。
例子:
#include <iostream> using namespace std; template<class T1,class T2> T1 Max(T1 a, T2 b) { return static_cast<T1>(a>b?a:b); } int main(void) { cout<<Max(2.3,5)<<endl; return 0; }