【Data】数据结构之C++程序设计(1)
2013-04-19 22:18
232 查看
一、函数与参数
1、传值参数:
假定a,b,c是传值参数,在函数被调用时,类型T(T可以是int,float等或自定义类型)的复制构造函数把相应的实际参数分别复制到形式参数a,b,c之中,以供函数使用;而在函数返回时,类型T的析构函数会被唤醒,以便释放形式参数a,b,c.
缺点:大量传值开销大
例如:
假定数据类型为用户自定义的 M a t r i x,那么它的复制构造函数将负责复制其所有元素,而析构函数则负责逐个释放每个元素(假定 Matrix 已经定义了操作符+,*和 /) 。如果我们用具有1 0 0 0个元素的Matrix 作为实际参数来调用函数 A b c,那么复制个实际参数给 a,b
和c将需要3 0 0 0次操作。当函数A b c返回时,其析构函数又需要花费额外的 3 0 0 0次操作来释放a,b和c。
2、引用参数
在上面的代码中, a,b 和c 是引用参数( reference parameter) 。如果用语句Abc (x, y, z) 来调用函数A b c,其中x、y 和z 是相同的数据类型,那么这些实际参数将被分别赋予名称a,b 和c,因此,在函数Abc 执行期间,x、y 和z 被用来替换对应的a,b 和c。与传值参数的情况不同,在函数被调用时,本程序并没有复制实际参数的值,在函数返回时也没有调用析构函数。
我们可以考察一下当a,b 和c 所对应的实际参数x,y 和z 分别是具有1 0 0 0个元素的矩阵时
的情形。由于不需要把x,y 和z 的值复制给对应的形式参数,因此我们可以节省采用传值参数
进行参数复制时所需要的3 0 0 0次操作。
###(注意这里只是节省了复制构造函数的3000次操作,而没有节省析构函数的3000次操作)###
3、常量引用参数
使用关键字const 来指明函数不可以修改引用参数的值,这在软件工程方面具有重要的意义。这将立即告诉用户该函数并不会修改实际参数。
对于诸如i n t、float 和char 的简单数据类型,当函数不会修改实际参数值的时候我们可以采用传值参数;
对于所有其他的数据类型(包括模板类型) ,当函数不会修改实际参数值的时候可以采用常量引用参数。
###(为什么这样呢?)###
4、返回值
函数可以返回值,引用或常量引用。在前面的例子中,函数 Abc 返回的都是一个具体值,
在这种情况下,被返回的对象均被复制到调用(或返回)环境中。对于函数 Abc 的所有版本来说这种复制过程都是必要的,因为函数所计算出的表达式的结果被存储在一个局部临时变量中,当函数返回时,这个临时变量(以及所有其他的临时变量和传值形式参数)所占用的空间将被释放,其值当然也不再有效。为了避免丢失这个值,在释放临时变量以及传值形式参数的空间之前,必须把这个值从临时变量复制到调用该函数的环境中去。
如果需要返回一个引用,可以为返回类型添加一个前缀&。如:
T& X(int i, T& z)
定义了一个函数X,它返回一个引用参数Z。可以使用下面的语句返回z:
return z;
这种返回形式不会把z 的值复制到返回环境中。当函数X返回时,传值形式参数i 以及所有局部变量所占用的空间都将被释放。由于z 是对一个实际参数的引用,因此,它不会受影响。如果在函数名之前添加关键字c o n s t,那么函数将返回一个常量引用,例如:
const T& X (int i, T& z)
除了返回的结果是一个不变化的对象之外,返回一个常量引用与返回一个引用是相同的。
1、传值参数:
template<class T> T Abc(T a, T b, T c) { return a+b+b*c+(a+b-c)/(a+b)+4; }
假定a,b,c是传值参数,在函数被调用时,类型T(T可以是int,float等或自定义类型)的复制构造函数把相应的实际参数分别复制到形式参数a,b,c之中,以供函数使用;而在函数返回时,类型T的析构函数会被唤醒,以便释放形式参数a,b,c.
缺点:大量传值开销大
例如:
假定数据类型为用户自定义的 M a t r i x,那么它的复制构造函数将负责复制其所有元素,而析构函数则负责逐个释放每个元素(假定 Matrix 已经定义了操作符+,*和 /) 。如果我们用具有1 0 0 0个元素的Matrix 作为实际参数来调用函数 A b c,那么复制个实际参数给 a,b
和c将需要3 0 0 0次操作。当函数A b c返回时,其析构函数又需要花费额外的 3 0 0 0次操作来释放a,b和c。
2、引用参数
template<class T> T Abc(T& a, T& b, T& c) { return a+b+b*c+(a+b-c)/(a+b)+4; }
在上面的代码中, a,b 和c 是引用参数( reference parameter) 。如果用语句Abc (x, y, z) 来调用函数A b c,其中x、y 和z 是相同的数据类型,那么这些实际参数将被分别赋予名称a,b 和c,因此,在函数Abc 执行期间,x、y 和z 被用来替换对应的a,b 和c。与传值参数的情况不同,在函数被调用时,本程序并没有复制实际参数的值,在函数返回时也没有调用析构函数。
我们可以考察一下当a,b 和c 所对应的实际参数x,y 和z 分别是具有1 0 0 0个元素的矩阵时
的情形。由于不需要把x,y 和z 的值复制给对应的形式参数,因此我们可以节省采用传值参数
进行参数复制时所需要的3 0 0 0次操作。
###(注意这里只是节省了复制构造函数的3000次操作,而没有节省析构函数的3000次操作)###
3、常量引用参数
template<class T> T Abc(const T& a, const T& b, const T& c) { return a+b+b*c+(a+b-c)/(a+b)+4; }
使用关键字const 来指明函数不可以修改引用参数的值,这在软件工程方面具有重要的意义。这将立即告诉用户该函数并不会修改实际参数。
对于诸如i n t、float 和char 的简单数据类型,当函数不会修改实际参数值的时候我们可以采用传值参数;
对于所有其他的数据类型(包括模板类型) ,当函数不会修改实际参数值的时候可以采用常量引用参数。
###(为什么这样呢?)###
4、返回值
函数可以返回值,引用或常量引用。在前面的例子中,函数 Abc 返回的都是一个具体值,
在这种情况下,被返回的对象均被复制到调用(或返回)环境中。对于函数 Abc 的所有版本来说这种复制过程都是必要的,因为函数所计算出的表达式的结果被存储在一个局部临时变量中,当函数返回时,这个临时变量(以及所有其他的临时变量和传值形式参数)所占用的空间将被释放,其值当然也不再有效。为了避免丢失这个值,在释放临时变量以及传值形式参数的空间之前,必须把这个值从临时变量复制到调用该函数的环境中去。
如果需要返回一个引用,可以为返回类型添加一个前缀&。如:
T& X(int i, T& z)
定义了一个函数X,它返回一个引用参数Z。可以使用下面的语句返回z:
return z;
这种返回形式不会把z 的值复制到返回环境中。当函数X返回时,传值形式参数i 以及所有局部变量所占用的空间都将被释放。由于z 是对一个实际参数的引用,因此,它不会受影响。如果在函数名之前添加关键字c o n s t,那么函数将返回一个常量引用,例如:
const T& X (int i, T& z)
除了返回的结果是一个不变化的对象之外,返回一个常量引用与返回一个引用是相同的。
相关文章推荐
- 数据结构与程序设计——C++语言描述(Data Structures & Program Design in C++) by Robert L.Kruse & Alexander J.Ryba
- 对Exercise E2.(b)的理解与答案 (数据结构与程序设计C++)
- 数据结构与程序设计——C++语言描述(Data Structures & Program Design in C++) by Robert L.Kruse & Alexander J.Ryb
- 数据结构与程序设计c++-----栈(stack)与队列(queue)
- 数据结构与程序设计——C++语言描述(Data Structures & Program Design in C++) by Robert L.Kruse & Alexander J.Ryba
- C++程序设计-第十周循环结构程序设计上机实践项目
- 数据结构——栈——C++实现栈及其操作
- 数据结构,图的邻接矩阵创建,邻接矩阵与邻接表的交换,两种表的输出,过程用C++实现
- 数据结构:图(十字链表存储 c++实现)
- Java程序设计(Java9版):第2章 数据类型与运算符(Data types and Operators)
- 数据结构与程序设计————编程原则
- 数据结构与算法之递归算法 C++和PHP实现
- C++自定义数据类型之结构
- 数据结构基础(C++版)(张力译版)校正 之三 .
- 数据结构与程序设计第一章编程原则总结
- 关于C++二进制文件读取转换,数据版本升级,增加字段等结构调整工具的思路。
- C++ 数据结构
- Lua与C++ 第四篇(获取Lua表结构数据)
- [C++ 二叉树的构建与遍历] 数据结构实验之二叉树二:遍历二叉树
- 标准模板库 STL-2 编程题#3:Set(Coursera 程序设计与算法 专项课程3 C++程序设计;执行输入的命令和数据)