C++Primer Plus(第六版)第七章学习笔记

7.1 函数基本知识

  • 提供函数定义
  • 提供函数原型
  • 调用函数

7.1.1 函数原型与函数调用

函数原型就是以前学的时候的声明的意思,是一个语句,以分号结尾,不用给出变量名,只用在括号内给出类型列表。

原型的作用是告诉编译器此函数返回值类型或者有无返回值

函数的定义分有返回值和无返回值两种。有返回值的要在函数名前标识返回值类型。

当传参与声明中的类型不同时,如果都是算术类型,则cpp中可以自动转换,但在c中不会。

静态类型检查 :编译阶段进行的原型化

7.2 函数参数和按值传递

double vplume = cube(side);
//其中side是一个变量,在前面的程序运行中其值为5,cube函数头
double cube(double x);

调用时,cube创建一个名为x 的double型的变量,side将值传入x。
其中的x就是形参(argument),side就是实参(parameter)

函数中声明的变量是函数私有变量,在调用是计算机分配内存,结束时释放内存,也叫创建和毁坏变量

7.2.1 多个参数

就函数的参数列表中加逗号再加更多的参数及参数类型。

7.3 函数与数组

在函数的形参部分使用数组的话

sum_arr(int arr[],int n);
//int arr[]与int *arr一样,第一种传递的其实也只是数组头的地址,所以是个指针类型

在函数的调用中,计算机先创建一个名为arr的int型指针,指向cookies数组的数组头,从而进行数据的使用。
传递一个指针来代表数组,可以为计算机节省复制数组的空间,而且用数组名传递时使用的是原始的数组

当有只读性质的函数需要定义时,使用const来保护所被读取的数据

扫描二维码关注公众号,回复: 5382668 查看本文章

7.3.4 另一种传递数组入函数的方式

利用数组区间的函数
在传参时传入两个指针,标识数组开始的地址和结束的地址

7.3.5 const与指针

两种使用方式
1.指针指向const的常量对象——防止指针修改对象值
2.指针声明为常量指针——防止指针指向其他地址

int age = 36;
const int *pt =  &age; //此为pt指向的const int型变量,不能修改该int型变量的值,
//不一定该变量就是常量,只是对于pt指针而言是常量

const float g_earth = 9.80;
const float *pe = &g_earth; //将const值赋予const指针可以实现

const float g_moon = 1.63;
float * pt = &g_moon; //无效,不能将const值赋予常规指针

const int **pp2;
int *p1;
const int n = 13;
pp2 = &p1; //not allowed but suppose it were
*pp2 = &n;//valid
*p1 = 10;//valid
//所以如果允许二级间接关系将非const赋予const的话,最终就可以修改const常量的值,所以cpp禁止这种操作

int const * pt//pt不能修改指向的值
int * const pt //pt的值不能被修改

7.4 函数与二维数组

用二维数组为参数的函数注意点:
二维数组参数部分只用数组头及行数
原因可以使用线性代数中矩阵的向量表示的思想
一个m×n矩阵,相当于n个m元列向量,或者m个n元行向量
所以在二维数组与函数的关系里,函数调用的参数部分就相当与将二维数组由多少个行向量组成给表示出来。每一个行向量的具体元素数在声明的时候做标识

int data[3][4];
int total = sum(data,3) //将有多少个行向量给标识出来

int sum(int *(ar2)[4],int size) //声明部分将每个行向量有多少个元素给标识出来(所以data的本质是——3个指针,每个指针指向由四个int组成的数组

7.5 函数与C风格字符串

在使用C字符串为参数的函数中,用char来作为形参形式。
在返回字符串的函数中,返回字符串地址,即返回值为char

7.6 函数与结构

结构体和数组不同,是可以直接看作变量的,也能满足按值传递
cin对象作为测试语句是,将输入转化为bool值来判断输入是否有效

7.7 函数和string对象

string对象与结构类似,可以进行完整的实体传递。

7.9 递归

函数调用自己即为递归
c++中不允许main()调用自己

递归一般需要一个终止调用链的内容,一般吧调用自己的部分放在if分支语句中
在递归中,每一层递归的调用都是单独创造一个形参出来进行函数的基本操作

程序清单 7.17

//递归设计
void subdivide(char *ar, int low , int high , int level)
    {
        if (level == 0)
            return;							//条件1:设定终止调用条件
        int mid = (high + low)/ 2; 
        ar[mid] = '|';						//statement ,执行单一工作
        subdivide(ar, low, mid, level - 1);  //调用自己
        subdivide(ar, mid, high, level - 1); //调用自己
    }

递归函数的设计中,终止调用链的条件是最重要的一部分,需要找出一个最基础一层的特点,利用分支条件将其设定为终止条件,此时剩余的部分会返回上一层,有点像盗梦空间。

7.10 函数指针

想要将算法函数地址传递给指定的函数名,

  • 获取函数地址
  • 声明函数指针
  • 使用函数指针来调用函数
process(think) //think函数的地址
thought(think()) //think 函数返回值

//声明函数指针要指定指向的类型
double pam(int); //prototype

double (*pt)(int); //此声明讲上方的pam替换为了 “*pt”,所以
                          //*pt就是函数pam,而pt就是函数指针

**注意:**如果不带括号,*pt(int)来声明的话,表示的是一个返回值是double指针的名为pt的函数。

将函数指针声明成功后,就可以直接给该指针赋值,就是直接将函数的名字赋予该指针。

猜你喜欢

转载自blog.csdn.net/baidu_29452653/article/details/87789946