函数重载

函数重载允许我们创建名称相同的函数,但是为了编译器能够正确的编译这个程序,这些函数采用不同的参数列表来区分,比如:

int ave(int a,int b){
    return (a+b)/2;
}

int ave(int a,int b,int c){
    return (a+b+c)/3;
}

float ave(float a,float b,float c){
    return (a+b+c)/3;
}

int main(){
    cout<<ave(2,3);
    cout<<ave(2,3,4);
    cout<<ave(2.0f,3.0f); //这个就会调用 第一个int ave(int a,int b)
}

若是 增加了一个代码

float ave(int a,int b){return (a+b)/2;}

再次调用这个这个函数会报错

cout<<ave(2.0f,3.0f);

因为编译器无法单纯的通过返回值来确定你要返回的函数

所以以下这样的函数就是不能重载的:

int ave(int a,int b); 和 float ave(int a,int b);

int ave(int*,int); 和 int ave(int[],int); //本质上同为指针

还有特殊案例:

int ave(int a,int b); 和 int ave(int& a,int& b);
//传入 1,2 编译的时候能通过,但是遇到a = 1, b = 2; 传入 a 、 b时会产生歧义,所以编译不能通过;


//----------------------------------------------------//


int ave(int a,int b); 和 int ave(const int  a,const int b);// 也不行

//----------------------------------------------------//

//但是 当存在 
const int a = 10; const int b = 10;
int ave(int& a,int& b); 和 int ave(const int& a,const int& b);// 可行


//----------------------------------------------------//


int ave(int& a, int& b) {
    cout << "两个 int 参数";
    return (a + b) / 2;
}

float ave(float a, float b) {
    cout << "两个 float 参数";
    return (a + b) / 2;
}

int main() {
    float a = 10, b = 10;
    cout << ave((int)a,(int)b); //调用的还是float ave(float a, float b);
    //零时变量没有引用(即指针地址)}
    return 0;
}

函数重载的时候不能设置缺省参数

函数模板

基本语法

template <typename type1>
type1 ave(type1 a,type2 b){
    type1 c = a + b;
    return c/2;
}

//多个类型
template <typename T1,typename T2,typename T3>
T3 ave(T2 a,T1 b){
//............
}

使用案例

ave<int>(int a,int b);
ave<float><float a,float b>;

模板例外和重载(优先级情况)

#include <iostream>
using namespace std;

template<typename type1>
type1 bigger(type1 a, type1 b) {
	cout << "模板1" << endl;
	return a > b ? a : b;
}

//模板的重载
template<typename type1>
type1 bigger(type1 a, type1 b,type1 c) {
	cout << "模板重载" << endl;
	return a+b+c;
}

template<>
int bigger(int a, int b) {
	cout << "模板例外"<< endl;
	return *a > *b ? a : b;
}

int bigger(int a, int b) {
	cout << "重载"<< endl;
	return a > b ? a : b;
}

void main() {
	int a{ 10 };
	int b{ 12 };
	cout << bigger(&a,&b);
}

优先级 重载>例外>模板

函数模板参数

模板默认参数

template <typename TR = int,typename T1,typename T2>
TR ave(T1 a,T2 b){return (a+b)/2;}//返回指定的类型

main(){
    ave()<<(100,200);//当没指定 数据类型时 就默认
    ave()<float>(100,200);
}

非类型的模板参数

//模板函数可以有非类型的模板参数
template <int max,int min,typename T1>
bool AddHp(T1& Hp,type damage){
    hp-=damage;
    if(hp>max)hp=max;
    return hp<min;
}

//使用
main(){
    int hp = 2500;
    AddHp<2000,1000>(hp,100);
}

用非类型参数处理固定大小的数组

template <typename T1,short count>
T1 ave(T1(&ary)[count])
{
    T1 all{};
    for(int i = 0;i < count;i++){
        all+=ary[i];
    }
    return all/count;
}

//使用
main(){
    int a[5]{1,2,3,4,5};
    cout<<ave(a); //自动推断出了 count = 5
}

函数模板的本质

万能排序工具

#include<iostream>
//万能排序模板

template <typename T1>
void Sort(T1* arr, unsigned count, bool bigSort = true) {
	for (size_t i = 1; i < count; i++) {
		for (size_t i = 1; i < count; i++) {
			bool bcase = bigSort ? arr[i] > arr[i - 1] : arr[i] < arr[i - 1];
			if (bcase) {
				std::swap(arr[i], arr[i - 1]);
			}
		}
	}
}

//遍历输出
void show(int* arr,unsigned count) {
	for (size_t i = 0; i < count; i++) {
		std::cout << arr[i] << "  ";
	}
	std::cout << std::endl;
}

int main() {
	int a[5]{ 2302,5212,3654,9740,5200 };
	show(a, 5);
	std::cout << std::endl;
	Sort(a, 5);
	show(a,5);
	return 0;
}
//利用函数模板实现以下函数
//能够给 数组内的元素自动排序
/**
int a[5]{2302,.5212,3654,9740,5200}
sort(a,5);



*/

函数的调用约定

x64 架构默认 fastcall