Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3900671
  • 博文数量: 408
  • 博客积分: 10227
  • 博客等级: 上将
  • 技术积分: 9820
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-17 21:48
个人简介

非淡泊无以明志,非宁静无以致远

文章存档

2022年(1)

2021年(1)

2020年(2)

2019年(5)

2018年(4)

2017年(3)

2016年(24)

2015年(8)

2014年(7)

2013年(3)

2012年(1)

2011年(23)

2010年(179)

2009年(147)

分类: C/C++

2010-04-27 21:59:14

1.问题提出:

当一个类的对象作为实参数传递时,使用值传递和引用传递有什么区别?

   比如: DateType ExampleFun(CString &strFileName,...)

         DateType ExampleFun(CString strFileName,...)

解答之前,我们先来看2个基本的概念:形参和实参。

->通俗的讲:形参是形式上的参数,实参是实际的参数;

->详细的讲:形参只是对实参的一种抽象类型描述,只是声明一个函数(方法)能接受什么类型的实参,而不确定接受的实参具体内容是多少;

实参就是传递给函数(方法)对应形参的具体内容(),形参的初始指(内容)由实参决定.形参在函数(方法)结束返回后就被释放了.

 

2.参数传递方式分:传值和传址;

1).传值方式,只是将实参的值的拷贝传递给函数(方法),在方法内对形参进行操作,其对象是实参的拷贝,对实参不能造成影响.在方法结束返回后,形参被释放丢弃,实参的内容并不会改变;

2).传址方式,将实参的地址传递给函数(方法),在方法内对形参进行操作即等于对实参进行相同的操作,在方法结束返回后,形参同样被释放,实参的内容将会是对形参进行操作的结果.

而传址方式,又可以细分为:引用传递(pass-by-reference) , 指针传递(pass-by-pointer)

引用其实就是对象的别名,传对象的引用,用于把一个对象的地址作为参数传过去,而不是对象本身。

这是我们就明白了前面问题的答案:传递引用,避免了一次实参到形参的拷贝,提高了效率。

3.关于何时使用引用参数?

1)使用引用参数的主要原因有:

  程序员能够修改调用函数中的数据对象

  通过传递引用而不是整个数据对象,可以提高运行速度

2)对于使用传递的值而不做修改的函数:

  如果数据对象很小,如内置数据对象,则按值传递

  如果数据对象是数组,则使用指针,并将指针声明为指向const的指针

  如果数据对象是较大的结构则使用const指针或const引用,以提高效率,节省复制结构所需的时间和空间

如果数据对象是类对象则使用const引用。类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因,因此传递类对象的标准方式是按照引用传递。

3)对于修改调用函数中数据的函数:

 如果数据对象是内置数据类型则使用指针。

 如果数据对象是数组则只能使用指针

 如果数据对象是结构则使用引用或指针

 如果数据对象是类对象则使用引用

4.总结:

c/c++编程中,到底什么时候该用指针来传递参数呢?总结如下:

1. 需要改变实参的时候, 只能用指针.

2. 传递大型结构并且"只读"其元素的时候,

因为大型结构通过值传递, 需要拷贝其每个元素, 这样效率太低.

3. 需要遍历数组或频繁引用其元素时, 这样效率比使用下标高.

4. 动态分配空间时, 必须使用指针.

5. 传递数组时, 必须使用指针.

6. 函数返回指针时, 比如fopen

7. 另外,有时候需要使用二级指针,即指针的指针,例如:

   MemAllocate(char *a){

    a=(char *)malloc(sizeof(char));

}

当调用此函数进行内存分配时,发现不能分配内存不能成功,因为此时对于a来说,形参改变了,但实参并不会改变,他们对应于不同的内存单元。正确的写法应该是:

    MemAllocate(char **a){

    *a=(char *)malloc(sizeof(char));

}

这样就能够正确地分配内存了。

 

阅读(6795) | 评论(0) | 转发(4) |
0

上一篇:UML-类图详解

下一篇:赋值兼容规则

给主人留下些什么吧!~~