声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2653|回复: 3

[C/C++] 一个基础概念的问题

[复制链接]
发表于 2010-11-21 15:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 Rainyboy 于 2010-11-21 16:51 编辑

一个很简单的交换两个输入参数值问题,参数用的指针传递。
mian()函数中调用正确的调用方法应该是swap(&a,&b)。问题是swap()时为什么用swap(a,b)也可以得到正确的程序输出呢?被人问我的基础的概念问题,我都被整的困惑了,还没想明白!欢迎各位解惑!谢谢……

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

  3. void swap(double *i,double *j)
  4. {
  5.       double temp;
  6.        temp=*i;
  7.       *i=*j;
  8.       *j=temp;
  9. }

  10. int main()
  11. {
  12.       double a,b;
  13.        a=2.22222,b=8.88888;
  14.       cout<<"Before swap a is "<<a<<", b is "<<b<<endl;
  15.       //swap(&a,&b);        //这种调用方式肯定是正确的
  16.       swap(a,b);              //为什么这样也能得到正确结果?
  17.      cout<<"Before swap a is "<<a<<", b is "<<b<<endl;
  18. return 0;
  19. }
复制代码

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2010-11-21 17:08 | 显示全部楼层
本帖最后由 Rainyboy 于 2010-11-21 17:11 编辑

换个函数名字,如:

  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;

  4. void t(double *i,double *j)
  5. {
  6.       double temp;
  7.        temp=*i;
  8.       *i=*j;
  9.       *j=temp;
  10. }

  11. int main()
  12. {
  13.       double a,b;
  14.        a=2.22222,b=8.88888;
  15.       cout<<"Before swap a is "<<a<<", b is "<<b<<endl;
  16.       //swap(&a,&b);        //这种调用方式肯定是正确的
  17.       t(a,b);              //为什么这样也能得到正确结果?
  18.      cout<<"Before swap a is "<<a<<", b is "<<b<<endl;
  19.          system("pause");
  20. return 0;
  21. }
复制代码

编译时就会如预期般出错:
错误
1
error C2664: “t”: 不能将参数 1 从“double”转换为“double *”
2
IntelliSense: "double" 类型的实参与 "double *" 类型的形参不兼容
3
IntelliSense: "double" 类型的实参与 "double *" 类型的形参不兼容

这是因为本来就有与swap重名的库函数(在命名空间std中):
  1. template<class _Ty> inline
  2.         void swap(_Ty& _Left, _Ty& _Right)
  3.         {        // exchange values stored at _Left and _Right
  4.         _Ty _Tmp = _Move(_Left);
  5.         _Left = _Move(_Right);
  6.         _Right = _Move(_Tmp);
  7.         }
复制代码
这是一个针对任意两个变量进行值交换的模板函数,swap在std命名空间中共10种重载,而你写的swap(double*,double*)不过是向其中增加了一种重载而已。

这就是c++中“多态”的一种体现,对那些比较通用的名字,还是要慎重啊。



发表于 2010-11-21 17:14 | 显示全部楼层
关于模板函数的使用,百度了一个例子,就放在这里吧:
  1. #include<iostream>

  2. using namespace std;

  3. template <typename T>
  4. T *fun(T a[],int n)
  5. {
  6.         int i = 0;
  7.         T temp;
  8.         for(i=0;i<n-1;i++)
  9.                 for(int j=i+1;j<n;j++)
  10.                 {
  11.                         if(a[i]>a[j])
  12.                         {
  13.                                 temp=a[i];
  14.                                 a[i]=a[j];
  15.                                 a[j]=temp;
  16.                         }
  17.                 }
  18. return a;
  19. }

  20. template<class T>
  21. void display(T a[],int n)
  22. {
  23.         for(int i=0;i<n;i++)
  24.                 cout<<a[i]<<' ';
  25.         cout<<endl;
  26. }

  27. int main()
  28. {
  29. int a[]={1,3,6,7,2,9};
  30. double b[]={1.3,2.8,6.9,7.1,5.6};

  31. cout << "排序前:";
  32. display(a,sizeof(a)/sizeof(a[0]));
  33. fun(a, sizeof(a)/sizeof(a[0]));
  34. cout << "排序后:";
  35. display(a,sizeof(a)/sizeof(a[0]));
  36. cout << endl;
  37. cout << "排序前:";
  38. display(b,sizeof(b)/sizeof(b[0]));
  39. fun(b, sizeof(b)/sizeof(b[0]));
  40. cout << "排序后:";
  41. display(b,sizeof(b)/sizeof(b[0]));
  42. system("pause");
  43. }
复制代码



 楼主| 发表于 2010-11-21 17:25 | 显示全部楼层
回复 2 # Rainyboy 的帖子

哦,呵呵。明白了,谢谢呵,还特意找了例子…
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-10 17:09 , Processed in 0.057963 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表