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
- 《C Primer Plus》学习笔记之 函数
- C++ Primer Plus学习之函数篇一
- C Primer Plus学习 一
- C Primer Plus 学习笔记系列之(一)
- 《C Primer Plus》 学习笔记系列之(一)
- 《C++.Primer.Plus》学习笔记(一)
- 《C++Primer Plus》学习笔记(一)
- [C++ Primer Plus]开始学习C++(一)
- C Primer Plus学习 十六 函数概述
- C Primer Plus学习 四十一 fopen ()函数
- C Primer Plus学习 五十四 内联函数
- C Primer Plus学习 五十六 qsort ()函数
- C++ Primer Plus学习之函数篇二
- C Primer Plus学习
- 《C Primer Plus》学习笔记之 C数据的属性(一)数据类型
- C Primer Plus学习 四十六 向函数传递结构信息 (一)
- 《C Primer PLus》实践之疑惑篇
- C Primer Plus(一)
- C语言学习大纲--运算符
- 中医与计算机结合能申请到高级别课题吗
- 《UNIX网络编程 卷1 套接口编程 》搜索目录
- Android自定义Button点击效果
- android系统信息(内存、cpu、sd卡、电量、版本)获取
- C++ Primer Plus学习之函数篇一
- 如何查看distirbution agent的执行进度
- linux0.11-malloc.c-分析
- js取数组两个数组的交集|差集|并集|补集|去重
- LINUX的ssh互信配置
- 机器数和码制
- Oracle存储过程,把数据导出至XML文件
- C/S与B/S谁与争锋之我见
- PHP+apache环境搭建