第七章---c++的编程模块

本章的主要内容:

  1. 函数的基本知识
  2. 函数原则
  3. 按值传递函数参数
  4. 设计处理数组函数
  5. 使用const指针参数
  6. 设计处理文本字符串的函数
  7. 设计处理结构的函数
  8. 设计处理string对象的函数
  9. 调用自身函数(递归)
  10. 指向函数的指针


函数的基本知识:
要使用函数需要完成下面三点:

  1. 提供函数的定义
  2. 提供函数原型
  3. 调用函数

c++对返回类型有一定限制,不能是数组,但可以是其他返回类型。


函数的返回过程:

函数通常将返回值复制到指定的CPU寄存器或者内存单元中将其返回,随后调用程序将查看该内存单元,返回函数和调用函数必须就该内存单元存储的数据的类型达成一致。


函数在执行返回语句后结束,如果函数包含多条返回语句,则函数在执行遇到的第一条返回语句结束。


原型的语法:

通常在原型的参数列表中,可以包括变量名,也可以不包括。原型中的变量名相当于占位符,因此不必与函数定义中的变量名相同。


原型保证了下面几点

  1. 编译器正确的处理函数的返回值
  2. 编译器检查使用的参数数目是否正确
  3. 编译器检查使用的参数类型是否正确


假设提供了一个参数,但其类型不正确,在c语言中,这将造成奇怪的错误,假设需要一个int值(16位),而用户提供了一个double值(64位),则函数值检查64位中的前16位;



函数参数和按值传递:

如果两个参数的类型相同,则必须分别指出每个参数的类型;

在函数中改变形参的值不会影响调用函数:

看下面这么一个例子说明函数时按值传递的:


下面是编译结果:


这说明了函数调用的时候是复制了一个参数副本。



函数和数组:


看上面这个函数原型,方括号指出 arr是一个数组,是真实情况并非如此,arr实际上并不是数组而是指针。

(假设该数组为 int类型)

cookies是数组名、根据c++规则 cookies是一个元素的地址,因此函数传递的是地址,由于数组为int类型,所以cookies的类型是 int指针类型

这表明函数的正确形式应该是这样的:


c++中,当且仅当函数头和函数原型中 int* arr 和 int arr[]意义才是相同的,其他情况是不一样的。


数组作为函数参数跟常规变量的区别:

传递常规变量时,函数将使用该参数的拷贝,但传递数组时函数将使用原来的数组,其实这并不违反c++的按值传递规则,因为在数组作为参数是我们传递的实际上是一个地址,(在退一步说,复制地址还是在原来的数组上操作)同时这也是一件好事:将数组地址作为参数,可以节省整个数组赋值过程的时间,如果数组过大,则使用拷贝的系统开销非常大,程序不仅需要更多的内存,而且还需要更多的时间来复制大块的数组。


下面来看一个例子:


下面是输出结果:



输出结果表明:对传递的地址使用sizeof只能的到一个指针变量的长度,而对数组名使用得到的是整个数组的长度,虽然他们的地址是相同,同时这也说明了:我们需要显示传递数组的长度。

该程序通过改变指针,来计算后面的值。

更多的使用函数数组示例:

1.填充数组

2.显示数组

在显示数组中,为了防止无意中修改数组和保护数组

我们可以这样定义函数:


3.修改数组


我们还可以对数组区间进行操作:

我们需要提供两个指针像这样:




指针和const:

来看下面几种情形:

第一种:


这说明:pt是一个const指针,不能通过指针来改变age的值;但是可以通过age来改变

第二种:


这个说明可以通过指针来改变一个const 常量,所以这种是不合法的;

第三种:

这说明这既不能通过指针来改变,也不能通过age来改变。

第四种:


第二条语句说明不能用指针来修改age的值,但是可以改变指针指向的地址;

第三条语句说明,不能改变指针指向的地址,但是可以改变指针指向的值;

要是能综合上面两种情况我们就能得出,既不能修改地址也不能修改值:

例如下面这种情况:












猜你喜欢

转载自blog.csdn.net/lily559/article/details/80557566