C++ Primer Plus学习之函数篇一

来源:互联网 发布:深圳大学怎么样 知乎 编辑:程序博客网 时间:2024/06/10 02:38

问题一:为什么需要函数原型?

             函数原型能够告诉编译器该函数有多少个参数,每个参数是什么类型,以及该函数的返回值的类型。这样函数被调用时,编译器就能够判断调用时程序员书写的调用是否正确。也就是能够进行语法检查,避免错误。

            那么编译器为什么需要函数原型?其实编译器是可以在文件中一个个的去寻找函数,找到了再调用。但是这样的问题是效率不高。因为编译器在寻找函数的时候会停止对main函数的编译。而且,如果函数不在文件中,就会找不到该函数。因为C++允许对多个文件进行单独的编译,然后组合在一起。因此需要进行函数原型的声明。

 

问题二:数组作为函数的参数

            首先要有一点常识,就是数组不能作为函数的返回值。除了数据,其他数据类型均可以作为函数的返回值。

            数组作为函数的参数,其实是数组的指针作为函数参数。

           如果数组作为函数的参数,函数原型的声明应该是这样子的:

                             int function(int arr[],int size,...)           或者是      int function(int* arr,int size, ...)

           以数组作为参数进行传递的时候,并不是按值传递(即传递一个实参的拷贝),而是传递的是数组的地址,针对的是原数组进行操作。

 

           这样就带来一个问题,如果该函数中对数组的内容进行修改,意味着其他人使用该数组时,只已经发生了变化。

           因此如果不希望函数对数组进行修改,在函数的定义时,添加const修饰数组参数。如下所示:

                            int function(const int arr[], int size,...)                                //这样只是在该函数中无法修改数组的元素

          (将指针参数声明为const类型的指针的两个理由:

                                   1. 避免无意间对参数的修改

                                   2. 函数可以处理const类型的实参和非const类型的实参,否则函数只能处理非const类型的实参

 

            引申:函数无法返回字符串(字符串相当于数组吗?),只能返回字符串的地址。

 

问题三:函数指针(涉及到二级函数指针就比较绕了)

           函数名就是一个函数指针,存放着指向该函数的地址。

           声明函数指针的模板做法:

                             double  (*pf)(double)                                 //如果double fun(double x),那么pf = fun.

          获取函数的结果时,假设将结果赋值给double型的x,有两种方式:

                             1. double x = (*pf)(5)                            (推荐)

                             2. double x = pf(5)

          在C++11中,可以使用auto直接将一个函数原型传递给一个变量,如下所示:

                             auto p2 = pf;                                          //自动推断并将函数指针传递给p2

          如果声明一个函数指针数组的话,按照下面的方式:

                            double (*pfs[3](double ) = {f1,f2}           //假设函数原型是f1,f2    这里不能使用auto,因为自动推断只适用于单值初始化

 

          当然,也可以使用typedef进行简化处理。

                            typedef double (*pf)(double)

                            pf  ftest = f1;                                         //假设函数原型是f1

 

 

 

原创粉丝点击