C++之函数的高级应用

内联函数

提高运行效率,但是占用了更多的内存。
一般的函数调用是将进入到对应的函数代码块,而内联函数是直接在代码段中插入函数的拷贝。

inline int func(int a,double b);
    ...
inline int func(int a,double b)
{
	...
}

在C语言中,可以使用#define进行操作。

引用变量

声明引用时,必须进行初始化,表明为何变量的引用。

int a;
int &b=a;

a为int变量,b为int的引用。a和b指向相同的值和内存单元。
当引用作为函数的参数时,在函数内,可以直接对原变量进行操作,而不是操作其拷贝。如果要避免引用的特性影响,可以考虑使用const对变量进行修饰
在这里插入图片描述
在函数中使用引用变量传递数据可以显著提高效率,节省时间与内存。
在引用作为返回值时,函数不能返回一个内存已经被清理的引用。
函数形参类型参考

函数的默认参数

对函数的参数进行默认赋值:
必须通过函数原型。

int func(int a,int b=0);
	...
int func(int a,int b)
{
	...
}

函数重载(多态)

主要的判别依据为函数的参数列表(函数特征标),C++内可以定义名称相同的函数,但必须是特征标不同的。而函数类型不能作为重载的依据。

int func(int a,int b)
int func(int a,double b)
long func(int a,int b)	//invalid 

如果可以重载多个函数,符合多个函数的定义,将调用最为匹配的版本。在使用过程中,可以直接当成多个函数进行声明/定义。

函数模板

如果需要多个将同一种算法用于不同类型的函数时,可以选用模板函数。

//function protype
template <typename  T>//or class T ,T means type
void func(T a,T b);
	...
template <typename T>
void func(T a,T b)
{	
	...
}

函数模板具体化及实例化

函数模板有时无法处理某些特殊类型的数据,此时需要为特殊类型提供具体化的模板定义。**显示具体化(specialization)**需要重写编写相关的函数定义。

//template function protype
template<class T>
void swap(T a,T b);

//explicit specializaion for double tyoe
template <> void swap<double>(double a,double b);	
template <> void swap(double a,double b);	//simpily form	
#include<iostream>
#include<cstring> 
using namespace std;

template <typename T>
T func(T temp[],int a);
//具体化方法 
template <> char *func<char*>(char* temp[],int a);

int main()
{
	int a[6]={5,6,2,3,1,3};
	float b[4]={2.1,3.2,4.3,5.6};
	char* q[4]={"hhaha","hiahiaok","ko whta","nuaksda"};	//使用q[4][20]会出错
	cout<<func(a,6)<<endl;
	cout<<func(b,4)<<endl;
	cout<<func(q,4)<<endl;
 } 

template <typename T>
T func(T temp[],int a)
{
	T max=temp[0];
	for(int i=0;i<a;i++)
	{
		if(max<temp[i])
		{
			max=temp[i];
		}
	}
	return max;
}
//需要自己重新编写定义
template <> char *func<char*>(char* temp[],int a)
{
	char *max=temp[0];
	for(int i=0;i<a;i++)
	{
		if(strlen(max)<strlen(temp[i]))
		{
			max=temp[i];
		}
	}
	return max;
}

实例化(instantiation)是指,程序根据函数模板来自动生成某种数据类型的函数。有隐式实例化显式实例化两种。

隐式实例化,显式实例化,与显示具体化统称为具体化。

//template function protype
template<class T>
void swap(T a,T b);

template void swap<char>(char &,char &);	//explict instantiation

	...
short a,b;
swap(a,b)	//implicit instantiation

函数的选择:(此处不再展开介绍)
在这里插入图片描述
非模板函数>模板函数,
模板函数中,显式实例化>隐式实例化。

  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值