captain114 发表于 2010-11-21 15:30

一个基础概念的问题

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

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

#include <iostream>
using namespace std;

void swap(double *i,double *j)
{
      double temp;
       temp=*i;
      *i=*j;
      *j=temp;
}

int main()
{
      double a,b;
       a=2.22222,b=8.88888;
      cout<<"Before swap a is "<<a<<", b is "<<b<<endl;
      //swap(&a,&b);      //这种调用方式肯定是正确的
      swap(a,b);            //为什么这样也能得到正确结果?
   cout<<"Before swap a is "<<a<<", b is "<<b<<endl;
return 0;
}

Rainyboy 发表于 2010-11-21 17:08

本帖最后由 Rainyboy 于 2010-11-21 17:11 编辑

换个函数名字,如:

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

void t(double *i,double *j)
{
      double temp;
       temp=*i;
      *i=*j;
      *j=temp;
}

int main()
{
      double a,b;
       a=2.22222,b=8.88888;
      cout<<"Before swap a is "<<a<<", b is "<<b<<endl;
      //swap(&a,&b);      //这种调用方式肯定是正确的
      t(a,b);            //为什么这样也能得到正确结果?
   cout<<"Before swap a is "<<a<<", b is "<<b<<endl;
         system("pause");
return 0;
}
编译时就会如预期般出错:
错误
1
error C2664: “t”: 不能将参数 1 从“double”转换为“double *”
2
IntelliSense: "double" 类型的实参与 "double *" 类型的形参不兼容
3
IntelliSense: "double" 类型的实参与 "double *" 类型的形参不兼容

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

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



Rainyboy 发表于 2010-11-21 17:14

关于模板函数的使用,百度了一个例子,就放在这里吧:#include<iostream>

using namespace std;

template <typename T>
T *fun(T a[],int n)
{
      int i = 0;
      T temp;
      for(i=0;i<n-1;i++)
                for(int j=i+1;j<n;j++)
                {
                        if(a>a)
                        {
                              temp=a;
                              a=a;
                              a=temp;
                        }
                }
return a;
}

template<class T>
void display(T a[],int n)
{
      for(int i=0;i<n;i++)
                cout<<a<<' ';
      cout<<endl;
}

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

cout << "排序前:";
display(a,sizeof(a)/sizeof(a));
fun(a, sizeof(a)/sizeof(a));
cout << "排序后:";
display(a,sizeof(a)/sizeof(a));
cout << endl;
cout << "排序前:";
display(b,sizeof(b)/sizeof(b));
fun(b, sizeof(b)/sizeof(b));
cout << "排序后:";
display(b,sizeof(b)/sizeof(b));
system("pause");
}


captain114 发表于 2010-11-21 17:25

回复 2 # Rainyboy 的帖子

哦,呵呵。明白了,谢谢呵,还特意找了例子…
页: [1]
查看完整版本: 一个基础概念的问题