p; //函数值为长整型
p=max(g,h,i);
cout<<"max_f="<<p<<endl;
}
3个数中的最大值
程序分析:
1.3.5 函数模板
函数重载可以实现一个函数名多用,将实现相同或类似功能的函数用同一个函数名来定义。但3个函数内容基本相同,会显得太过冗长,为了简化,C++提供了函数模板。即建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代替,这个通用函数就称为函数模板。
3个整数选出最大值代码优化如下:
#include<iostream>
using namespace std;
template<typename T> //模板声明,其中T为类型参数
T max(T a,T b,T c) //定义一个通用函数,用T做虚拟的类型名
{
if (b>a) a=b;
if (c>a) a=c;
return a;
}
int main()
{
int i1=8,i2=5,i3=6,i;
double d1=82.2,d2=53.4,d3=69.7,d;
long g1=78238,g2=-365,g3=45676,g;
i=max(i1,i2,i3); //调用模板函数,此时T被int代替
d=max(d1,d2,d3); //调用模板函数,此时T被double代替
g=max(g1,g2,g3); //调用模板函数,此时T被long代替
cout<<"max_i="<<i<<endl;
cout<<"max_d="<<d<<endl;
cout<<"max_g="<<g<<endl;
system("pause");
return 0;
}
3个数中最大数的模板优化
函数分析:
1.3.6 有默认参数的函数
一般情况下,在函数调用时形参从实参那里取值,因此实参的个数应与形参相同。同时我们也可以给形参设置一个默认值。
如有一函数声明:
float area(float r=6.5); //指定r的默认值为6.5。
area(); //相当于area(6.5)
area(7.5); //形参得到的值为7.5,而不是6.5
如果有多个形参,可以使每个形参都有一个默认值,也可以只对一部分形参指定默认值,另一部分不指定默认值。
实参与形参的结合是从左至右顺序进行的,因此指定默认值的参数必须放在形参表列中的最右端,否则出错。例如:
void f2(float a, int c, int b=0,char d='a'); //正确写法,默认值在形参表列中的最右端
//函数调用
f2(3.5, 5, 3, 'x') //形参的值全部从实参获得
f2(3.5, 5, 3) //******最后一个形参的值取默认值'a'
f2(3.5, 5) //最后两个形参的值取默认值,b=0,d='a'
注意:一个函数不能既作为重载函数,又作为有默认参数的函数。
1.3.7 变量的引用
1.引用的概念
在C++中,变量的“引用”就是变量的别名,因此引用又称为别名。
假如有一个变量a,想给它起一个别名b,可以这样编写:
int a;
int &b=a; //声明b是一个整型变量的引用变量,它被初始化为a
这就声明了b是a的“引用”,即a的别名。
对变量声明一个引用,并不另外开辟内存单元,b和a都代表同一变量单元。
当b作为了a变量的引用后,不能再作为其他变量的引用。
2.引用的简单实用
#include<iostream>
using namespace std;
int main()
{
int a=10;
int &b=a; //声明b是a的引用
a=a*a; //a的值变化了,b的值也应一起变化
cout<<a<<b<<endl;
b=b/5; //b的值变化了,a的值也应一起变化
cout<<b<<a<<endl;
system("pause");
return 0;
}
3.关于引用的简单说明
代码如下:
#include<iostream>
using namespace std;
int main()
{
int a=3;
int &b=a;
int &c=b;
cout<<&a<<" "<<endl; //输出a的内存地址
cout<<&b<<" "<<endl; //输出b的内存地址
cout<<&c<<" "<<endl; //输出c的内存地址,结果显示a,b,c的地址相同
system("pause");
return 0;
}
4.将引用作为函数参数
4.1.将变量名作为实参
例1.10 无法实现两个变量的值互换的程序
#include<iostream>
using namespace std;
void swap(int a,int b)
{
int te