C++允许用同一函数名定义多个函数, 而这些函数的参数个数和参数类型可以不相同。这就是函数重载。即对一个函数名重新赋予它新的含义使一个函数名可以多用。所谓重载,其实就是“一物多用”。
函数重载条件
例:
int max(int a, int b);
double max(double a, double b);
int max(int a, int b, int c);
int main()
{
int a=4, b=5, c=3;
double d1=1.2, d2=3.3;
cout << "max=" << max(a,c) << endl;
cout << "max=" << max(a,b,c) <<endl;
cout << "max=" << max(d1,d2) << endl;
return 0;
}
int max(int a, int b)
{
return a>b?a:b;
}
double max(double a, double b)
{
return a>b?a:b;
}
int max(int a, int b, int c)
{
int max;
max = a>b?a:b;
max = max>c?max:c;
return max;
}
系统会根据调用函数时给出的信息去找与之匹配的函数,上面的main函数3次调用max函数而每次实参的类型或个数不同,系统就根据实参的类型找到与之匹配的函数然后调用该函数。
在使用重载函数时, 同名函数的功能应当相同或相近, 不要用同一函数名去实现完全不相干的功能(如求最大值和求三角形面积), 虽然程序也能运行,但可读性不好易使人莫名其妙。重载的方法是很有用的, 后面还会有运算符的重载。
但能否对函数实现体进行简化呢。
C++提供了函数模板,所谓函数模板, 实际上是建立一个通用函数其函数类型和形参类型不具体指定, 用一个虚拟的类型来代表这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替不必定义多个函数,只需要定义一个模板即可。
例如定义以下模板用于求最大值:
template <typename T> //模板声明,其中T为类型参数
T max(T a, T b, T c) //定义一个通用函数,用T作虚拟的类型名
{
T max;
max = a>b? a : b;
max = max>c? max : c;
return max;
}
实际调用
#include
using namespace std;
template <typename T> //模板声明,其中T为类型参数
T max(T a, T b, T c)
{
T max;
max = a>b? a : b;
max = max>c? max : c;
return max;
}
int main()
{
int a=4, b=5, c=3;
double d1=1.2, d2=3.3;
cout << "max=" << max(a,b,c) <<endl;
cout << "max=" << max(d1,d2) << endl;
return 0;
}
可以看到,用函数模板比函数重载更方便,程序更简洁。但应注意它只适用于函数体相同函数的参数个数相同而类型不同的情况,如果参数的个数不同,则不能用函数模板。
当然类型参数可以不止一个, 可以根据需要自行灵活确定个数,如:
template<typename T>
void printArray(T arr[], int len) {
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
在C++中,函数的形参列表中的形参是可以有默认值的,但指定默认值的参数必须放在形参表列中的最右端,否则出错。
语法:
返回值类型 函数名 (参数= 默认值){ }
注意点:
例:
#include
using namespace std;
int max(int a, int b, int c=0);
int main()
{
int a=3, b=4, c=5;
cout << "max=" << max(a,b) << endl;
cout << "max=" << max(a,b,c) <<endl;
return 0;
}
int max(int a, int b, int c)
{
int max;
max = a>b? a : b;
max = max>c? max : c;
return max;
}
struct Student //自定义类型
{
int score; //分数
char name[128]; //名字
};
封装的意义
class Student
{
public:
//定义一个成员函数
void display()
{
cout <<"num:" << num << endl;
cout <<"name:" << name << endl;
cout <<"sex:" << sex << endl;
}
private:
// 声明三个成员变量
int num;
char name[20];
char sex;
};