一个基础概念的问题
本帖最后由 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: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++中“多态”的一种体现,对那些比较通用的名字,还是要慎重啊。
关于模板函数的使用,百度了一个例子,就放在这里吧:#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");
}
回复 2 # Rainyboy 的帖子
哦,呵呵。明白了,谢谢呵,还特意找了例子…
页:
[1]