与普通函数调用区别:
普通函数调用:
在调用时,先储存当前指令的地址,并将参数保存到堆栈(内存块),再跳到函数标记的起点,执行函数代码,然后跳回到标记点.来回跳跃位置意味着使用函数需要一定的开销.
内联函数:
内联函数相当于把函数内容复制到被调用的地方,这样就可以不用跳跃位置,因为内联函数比普通函数执行的速度要快,但是代价是要更多的内存,比如要调用10次,就要复制10个代码拷贝.所以应该有选择性的选择内联函数
什么时候使用内联函数:
如果执行代码的时间比处理函数调用机理长,则节省的时间只占整个过程非常小的一部分.如果执行代码时间非常短,则可以节省很大一部分时间.另一方面由于调用的时间非常的,所以节省的绝对值并不大,除非该函数经常被调用.
声明内联函数: |
在函数声明前加关键字:inline 在函数定义前加关键之:inline 可以省略原型,将整个定义(即函数头和所有函数代码)放在本应该提供原型的地方 注意:程序员请求将函数作为内联函数时,编译器并不一定会满足这种要求.它可能认为该函数过大或注意到函数调用了自己(内联函数不能递归),因此不将其作为内联函数. |
引用变量: |
引用变量是为已定义的变量起一个别名,主要作用是在调用函数时作为参数,这样函数就能够改变变量的值. |
创建引用变量: |
int rat; Int & crat=rat; 上面声明允许吧crat和rat的位置互换,他们指向相同的值和内存单元。 使用: cout<<crat; |
与指针的区别: |
除了表示方法不同外,最明显的差别就是引用必须再声明时就赋值。只能通过初始化来设置引用,不能通过赋值来设置 |
将引用变量作为参数: |
声明函数时参数应为引用变量,定义时也使用引用变量。 通过设置了引用变量,在函数中改变其值外部的值也跟着改变。 |
将结构用于引用: |
和普通变量的使用方法一样,不过结构引用在读取成员时还是用点(.)操作符,而不是->操作符 |
将引用用于返回值: |
当将返回值也用引用时,就不需要再创建变量了。需要注意的是当函数运行完成时,其中的变量也会跟着失效,所以如果使用引用返回值,那么返回的变量不能是在函数中创建的。如果需要创建变量,则有new 关键字创建,最后返回创建变量的地址指针,注意:使用new创建的变量在不使用时必须用delete释放空间。 |
默认参数: |
设置默认参数后,当调用函数时未能给出参数时,函数则以默认参数调用.如sum()函数默认的参数是2,那么sum();和sum(2)和等效的。 |
声明默认参数: |
只需在函数原型处给参数赋值就行了,如: void sum(int a=2); |
函数重载: |
根据参数不同而调用同一个函数,能够拥有多个重名不同参数的函数,就是函数重载。注意:重载是指不同的参数及类型.但是不包括引用,如果sum(int a)和sum(int & a),调用时sum(a);因为调用时可能产生二意性(参数a和int,int &都匹配),所以编译时不通过的。重载与参数是否是const无关 |
什么时候使用重载函数: |
当函数基本实现相同的功能,但数据不同时就可以选择使用重载函数。 |
函数模块: |
使用通用类型来定义函数,在使用时可以使用具体类型代替(如int和double) |
定义函数模块: |
template<class Any> void swap(Any &a,Any &b) { Any temp; temp=a; a=b; b=temp; } 第一行指出要建立一个模板,并将类型名命名为Any(可以自定义名字),这样当调用时使用int时,Any就可以说是int型的。 函数模块也可以重载 |