c++初级 之 函数的新特性

来源:互联网 发布:置信区间 知乎 编辑:程序博客网 时间:2024/06/08 18:16

c++的函数相比于c的函数来讲,有三个特性:1.可以重载 2.参数可以有默认值 3.新增内联函数

1.函数的重载其实就是同名但参数必不同、返回值可同可不同的一些函数,以下为例:

/*2017/7/24现在有一个数组,定义一个方法getMax(),利用函数的重载,分别实现:1、随意取出数组中的两个元素,传到方法getMax()中,可以返回较大的一个元素。2、将整个数组传到方法getMax()中,可以返回数组中最大的一个元素。*/#include<iostream>#include<stdlib.h>using namespace std;int getMax(int i,int j){if(i >= j){return i;}else{return j;}}int getMax(int* a,int n) //在函数中数组形参被弱化成指针,见http://www.cnblogs.com/zhuyf87/archive/2013/02/03/2890927.html{int max = a[0];for(int i = 1;i < n;i++){if(a[i] >= max){max = a[i];}else{continue;}};return max;}int main(){int a,b,numArr[3] = {3,8,6};a = getMax(numArr,3);//8b = getMax(numArr[2],numArr[0]);//6cout << "a = " << a << "b = " << b << endl;system("pause");return 0;}


2.函数的参数可以有默认值,而且若给某一参数设置了默认值,那么在参数表中其后(右边)所有的参数都必须也设置默认值,因为在调用函数时,给参数赋值是从最左边的参数开始赋值的,如果参数的默认值不是从右边开始或者是存在跳开赋默认值的话,那调用时的赋值就可能存在歧义,即不知道传入的值是要赋给有默认值的参数,还是要跳过有默认值的参数赋给后面没有默认值的参数。

3.新增内联函数inline。程序从写好到执行的步骤是:写(程序员)、预处理(将#include的内容都贴到程序里,将#define宏定义的东西替换到程序里)、编译(将高级语言写的程序编译成汇编语言)、汇编(将汇编语言翻译成二进制的机器码)、链接(把二进制码程序和它需要用到的库文件(比如cin、cout之类的函数是从iostream里来的,#include进来的只是它们的声明,但是光有声明没有定义是无法调用的,所以要将程序和定义这些头文件里声明内容的库文件链接起来)链接起来)、执行。

3.1内联函数在编译阶段时,系统会将程序里每个调用它的部分都换成它具体的定义里的代码,代码量会因此增加,但是却省去了之后执行时的函数调用过程,减少了调用开销,提高了执行效率。但是不是任何内联都比非内联好,如果函数体过于复杂,不仅起不到提高效率之用,还会大大增加代码冗余。

3.2内联函数和宏定义区别在于:宏定义是在预处理时被替换的,而内联函数是在编译时被替换的,这样会更加安全有效。

3.3内联函数的inline只是一种请求,一个好的编译器会根据函数的定义体自动取消不值得的内联(即有些函数即使采用了inline修饰,也可能不会被编译成内联),或者自动内联一些没有inline修饰的函数。可参见http://blog.csdn.net/u011327981/article/details/50601800

例如下:

/*2017/7/24 c++函数新特性1.赋初值2.重载3.内联inline*/#include<iostream>#include<stdlib.h>using namespace std;void func(int i = 10,int j = 20,int k = 30);//声明函数时,从最右边的参数开始赋初值,不能左边有初值而右边没有,也不能跳着赋初值。void func(double i,double j);int main(){func();func(1,2);func(1.5,3.0);system("pause");return 0;}
inline void func(int i,int j,int k)  //定义函数时可以不写初值。inline可以只在定义时写,声明处没必要也最好不要写,因为系统不一定会内联它
{cout << i << "," << j << "," << k << endl; }void func(double i, double j){cout << i << "," << j << endl; }





原创粉丝点击