Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105061
  • 博文数量: 25
  • 博客积分: 514
  • 博客等级: 下士
  • 技术积分: 690
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-07 01:22
个人简介

漂泊海外的游子

文章分类

全部博文(25)

文章存档

2015年(2)

2013年(1)

2012年(22)

分类: C/C++

2012-09-21 22:04:59

三种:传值,传址,引用。
我先前的一片博文没写清楚,现在比以前更清楚了。

效果:传值不改变外部对象,传址和引用改变外部对象。

相比C,引用是新加的。

引用和传址其实一回事,最终的效果,就是函数使用地址改变了外部对象。 引用通过变量名和取址符(&)完成,传址通过指针完成。
=================================================
举《think in c++》的例子吧。

example1, PassByvalue.cpp


点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;

  3. void f(int a) {
  4.   cout<<"a= "<<a<<endl;
  5.   a=5;
  6.   cout<<"a= "<<a<<endl;
  7. }

  8. int main () {

  9.   int x=47;
  10.   cout<<"x= "<<x<<endl;
  11.   f(x);
  12.   cout<<"x= "<<x<<endl;
  13. }

example2, PassByAddress.cpp

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;

  3. void f (int * p){

  4.    cout<<"p= "<<p<<endl;
  5.    cout<<"*p= "<<*p<<endl;
  6.    *p=5;
  7.    cout<<"p= "<<p<<endl;
  8. }

  9. int main() {

  10.    int x =47;
  11.    cout<<"x= "<<x<<endl;
  12.    cout<<"&x= "<<&x<<endl;
  13.    f(&x);
  14.    cout <<"x= "<<x<<endl;
  15. }

example3. PassReference.cpp

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;

  3. void f(int & r) {

  4.   cout << "r= "<<r<<endl;
  5.   cout <<"&r= "<<&r<<endl;
  6.   r=5;
  7.   cout<<"r= "<<r<<endl;
  8. }

  9. int main() {

  10.   int x=47;
  11.   cout << "x= "<<x<<endl;
  12.   cout<<"&x= "<<&x<<endl;
  13.   f(x);
  14.   cout<<"x= "<<x<<endl;
  15. }


=================================================================
接口

void f(int a)
f(x);
函数参数只要求传入的是int型的变量。
函数调用时,只用到变量名本身。
-------------------------
void f (int * p)
f(&x);
函数参数表明是一个int型的指针。
函数调用时,所以使用了取址符(&)。指针是存地址的变量,换句话,指针就是地址。所以需要加上取址符。这也是为什么叫做传址。
&x,就是将x的地址传给函数,而不是x自己。
--------------------------
void f(int & r)
f(x);
跟传值的形式类似。但是函数f的参数类型不一样,使用了int&表示传入的变量将以引用的方式处理。也就是说,相当于引用了变量x的地址到函数里,在本函数内的操作,仍然使用变量名x操作,只不过将会影响到变量本身。


===================================================
总结
想不改变对象本身,请使用传值的方式。
想修改对象,请将地址传入。可以用传址(指针实现),也可以使用引用(在函数参数中,用取址符(&)表明是引用)。


阅读(4285) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~