C++ Primer Plus Chapter7

Chapter7 函数基础

函数参数和按值传递

C++ 通常按值传递参数,函数将数值参数赋给一个新的变量,这样将不会影响原来的数据。

用于接受传递值的变量被称为形参,传递给函数的值被称为实参。

但在传递数组时,是将数组的首地址的值赋给一个新的变量,实际修改了原始数据。

为了保护数组内容,可以在声明函数原型时使用关键字const,该声明意味着函数将数组是为只读数据。

void show_array(const double ar[], int n);

指针和const

存在两种不同的方式将 $\color{red}{const}$ 关键字用于指针。

const int * p1;
int * const p2;

对于p1,其指向一个 const int。这种声明可以防止p1指向的值被修改,但无法防止p1的值被修改。

对于p2,其指向一个 int。这种声明可以修改p2指向的值,但p2的值无法被修改。

对于p1,虽然声明的是指向 const int,但实际可以将 int 的地址赋给p1。p1同样可以防止通过 *p1 来修改值,但无法避免直接通过变量来修改它的值。

此外,也可以将指针指向指针

//如果涉及的是一级间接关系,即指针指向基本数据类型时,可以将非const的指针赋给const指针。
int age = 30;
int * pd = &age;		//*pd = 41 is valid
const int * pt = pd;	//*pt = 41 is invalid

//如果涉及为二级间接关系则不成立
const int **p2;
int *p1;
const int n = 13;
p2 = &p1;	//若能将p1的地址赋给p2,则可以通过p1来修改n的值了,但n为const int
*p2 = &n;
*p1 = 10;

$\color {red} {尽可能使用const}$

  • 避免修改数据导致的程序错误
  • 使用 $\color {red} {const}$ 使得函数可以同时处理 $\color {red} {const}$ 和 非 $\color {red} {const}$ 实参,否则只能接收 $\color {red} {const}$ 数据。

函数指针基础

$\color {red} {声明函数指针}$

double pam(int);	//prototype
double (*pf)(int);	//pf的特征标和返回类型必须与pam相同

$\color {red} {传递函数指针}$

void estimate (int lines, double (*pf)(int));

$\color {red} {使用函数指针调用函数}$

double pam(int);
double (*pf)(int);
pf = pam

double x = (*pf)(5);	//valid
double y = pf(5);		//valid

参考书目C++ Primer Plus 第6版