C++学习教程及习题 第五章(2)

2019-06-30 10:19

------------------------------------------------------------------------------

运算符 结合律 类型

------------------------------------------------------------------------------

() [] 右 括号

++ -- + - static_cast() 左 一元 & *

* / % 右 乘

+ - 右 加

<< >> 右 插入/读取

< <= > >= 右 关系

== != 右 相等

&& 右 逻辑AND

|| 右 逻辑或

?: 左 条件

= += -= *= /= %= 左 赋值

从左向从右向从左向从左向从左向从左向从左向从左向从左向从右向从右向 , 从左向右 逗号

------------------------------------------------------------------------------

图 5.5 运算符的优先级和结合律

5.4 按引用调用函数

C++用三种方式向函数传递数值:按值调用(call-by-value)、用引用参数按引用调用(call-by-reference reference argument)和用指针参数按引用调用(call-by-reference pointer argument)。第3章比较了按引用调用与按值调用,本章主要介绍用指针参数按引用调用。

第3章曾介绍过,return可以从被调用函数向调用者返回一个值(或不返回值而从被调用函数返回控制)。我们还介绍了用引用参数将参数传递给函数,使函数可以修改参数的原有值(这样可以从函数“返回”多个值),或将大的数据对象传递给函数而避免按值调用传递对象的开销(即复制对象所需的开销)。指针和引用一样,也可以修改调用者的一个或几个变量,或将大的数据对象指针传递给函数而避免按值调用传递对象的开销。

在C++中,程序员可以用指针和间接运算符模拟按引用调用(就像C语言程序中的按引用调用一样)。调用函数并要修改参数时,传递该参数地址,通常在要修改数值的变量名前面加上地址运算符(&)。第4章曾介绍过,数组不能用地址运算符(&)传递,因为数组名是内存中数组的开始位置(数组名等同于&arrayName[0]),即数组名已经是个指针。向函数传递参数地址时,可以在函数中使用间接运算符形成变量名的同义词、别名或浑名,并可用其修改调用者内存中该地址的

值(如果变量不用const声明)。

图5.6和5.7的程序是计算整数立方函数的两个版本cubeByValue和cubeByReference。图5.6按值调用将变量number传递给函数cubeByValue。函数cubeByValue求出参数的立方,并将新值用return语句返回main,井在main中将新值赋给number。可以先检查函数调用的结果再修改变量值。例如,在这

个程序中,可以将cubeByValue的结果存放在另一变量中,检查其数值,然后再将新值赋给number。

1 // Fig. 5,6: fig0506,cpp

2 // Cube a variable using call-by-value 3 #include 4

5 int cubeByValue( int ); // prototype 6

7 int main() 8 {

9 int number = 5; 10

11 cout << \12 number = cubeByValue( number );

13 cout << \14 return 0; 15 } 16

17 int cubeByValue( int n ) { 18

19 return n * n * n; // cube local variable n 2O }

输出结果:

The original value of number is 5 The new value of number is 125

图5.6 按值调用求出参数的立方

图5.7的程序按引用调用传递变量nunber(传递number的地址)到函数cubeByReference。函

数cubeByReference取nPtr(int的指针)作为参数。函数复引用指针并求出nPtr所指值的立方,从

而改变main中的number值。图5.8和5.9分别分析了图5.6和1.7所示程序。

1 // Fig. 5.7: fig05_07.cpp

2 // Cube a variable using call-by-reference 3 // with a pointer argument 4 #include 5

6 void cubeByReference( int* ); // prototype 7

8 int main() 9 {

10 int number = 5; 11

12 cout << \13 cubeByReference( &number );

14 cout << \15 return O; 16 } 17

18 void cubeByReference( int *nPtr ) 19 {

20 *nPtr = *nPtr = *nptr * *nptr; // cube number in main 21 }

输出结果:

The original value of number is 5 The new value of number is 125

图 5.7 用指针参数按引用调用求出参数的立方

常见编程错误5.5

要复引用指针以取得指针所指的值时不复引用指针是个错误。

接收地址参数的函数要定义接收地址的指针参数。例如,cubeByReference的函数首部如下所示:

void cubeByReference(int *nPtr)

这个函数首部指定函数cubeByReferenee接收整型变量的地址(即整型指针)作为参数,在nPtr中局部存放地址,不返回值。

cubeByReference的函数原型包含括号中的int*。和其他变量类型一样,不需要在函数原型中包括指针名。参数名仅用于程序中的说明,编译器将其忽略。 在需要单下标数组参数的函数首部和函数原型中,可以用cubeByReference参数表中的指针符号。编译器并不区分接收指针的函数和接收单下标数组的函数。当然,函数必须“知道”何时接收数组或要进行按引用调用的单个变量。编译器遇到形如int b[]的单下标数组函数参数时,编译器将参数变为指针符号int* const b(b是指向整数的常量指针),const见第51节介绍。声明函数参数为单下标数组的两种形式可以互换。 编程技巧5.2

除非调用者显式要求被调用函数修改调用者环境中参数变量的值,否则按值调用将参数传递给函数。这是最低权限原则的另一个例子。


C++学习教程及习题 第五章(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:城管执法局创建市级文明单位汇报材料

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: