《C++ Primer Plus》第7章学习笔记
2021-06-08 本文已影响0人
蓬篙人
内容思维导图
![](https://img.haomeiwen.com/i26433151/785d4764a6abb3e7.png)
1. 复习函数的基本知识
- 使用函数需完成的工作:
- 提供函数定义。
- 提供函数原型。
- 调用函数。
// 函数使用示例
#include <iostream>
void simple(); // 函数原型
int main()
{
using namespace std;
cout << "main() will call the simple() function: \n";
simple(); // 函数调用
return 0;
}
// 函数定义
void simple()
{
using namespace std;
cout << "I'm but a simple function.\n";
}
- 可将函数分为两类:没有返回值或有返回值
// void函数
void functionName(parameterList)
{
statements
return; // 可选
}
// 有返回值函数
typeName functionName(parameterList)
{
statements
return value; // 值将转换为类型typeName
}
- C++函数返回值不能是数组。通常,函数通过将返回值复制到指定的CPU寄存器或内存单元中来将其返回。
- 原型描述了函数到编译器的接口。
- 在C++中,不指定函数列表时应使用省略号:
void say(...);
- C++函数原型的功能:
- 编译器正确处理函数返回值。
- 编译器检查使用的参数数目是否正确。
- 编译器检查使用的参数类型是否正确。
- 在编译阶段进行的原型化被称为静态类型检查(static type checking)。
- 用于接收传递值的变量被称为形参,传递给函数的值被称为实参。
2. 函数和数组
- 数组作为函数参数,实际传递的是指针(即第一个元素的地址),这意味着函数中使用的是原来的数组(没有拷贝数组的数据)。
-
const
用于指针- 让指针指向一个常量对象,防止使用该指针来修改所指向的值。
- 将指针本身声明为常量。
// 声明指向常量的指针
int age = 39;
const int* pt = &age;
*pt += 1; // 错误!!!
int age2 = 80;
pt = &age2; // 可以
// 声明指针常量
int sloth = 3;
int* const finger = &sloth;
// 指向const对象的const指针
double trouble = 2.0E30;
const double* const stick = &trouble;
- C++禁止将
const
的地址赋给非const
指针。 - 仅当只有一层间接关系(如指针指向基本数据类型)时,才可以将非
const
地址或指针赋给const
指针。
const int** pp2;
int* p1;
pp2 = &p1; // 不允许
- 通常将指针作为函数参数来传递时,可以使用指向
const
的指针来保护数据。
3. 函数和二维数组
- 二维数组作为参数
int data[3][4] = { { 1, 2, 3, 4 }, { 9, 8, 7, 6 }, { 2, 4, 6, 8 } };
int total = sum(data, 3);
// 上述函数sum()的原型如下:
int sum(int (*ar2)[4], int size);
// 或
int sum(int ar2[][4], int size);
- 上述代码中的函数
sum()
在声明参数ar2
时,没有使用const
,因为这种技术只能用于指向基本类型的指针,而ar2
是指向指针的指针。
4. 函数和C-风格字符串
- 字符串作为函数参数的3种表示方式:
-
char
数组。
-
- 用引号括起来的字符串常量。
- 被设置为字符串的地址的
char
指针。
- 被设置为字符串的地址的
- 将字符串作为参数来传递,实际传递的是字符串第一个字符的地址。
5. 递归
-
void
类型的递归函数代码格式如下:
void recurs(argumentlist)
{
statements1
if(test)
recurs(arguments)
statements2
}
- 递归方法有时被称为分而治的策略(divide-andconquer strategy)。
// 分而治策略示例
void subdivide(char ar[], int low, int hight, int level)
{
if(level == 0)
return;
int mid = (high + low) / 2;
ar[mid] = '|';
subdivide(ar, low, mid, level - 1);
subdivide(ar, mid, high, level - 1);
}
6. 函数指针
- 函数的地址是存储其机器语言代码的内存的开始地址。
- 获取函数的地址:使用函数名即可。
- 通常,要声明指向特定类型的函数的指针,可以首先编写这种函数的原型,然后用
(*pf)
替换函数名,这样pf
就是这类函数的指针。
double pam(int); // 函数原型
double (*pf)(int); // pf为带一个int参数返回值类型为double的函数的指针
- C++允许像使用函数名那样使用
pf
。
double pam(int);
double (*pf)(int);
pf = pam;
double y1 = (*pf)(5); // 使用指针调用pam()函数
double y2 = pf(5); // 与上行代码等效