——Day.27——C++基础——函数的默认参数、函数重载、函数模板、实例化与具体化

本次内容比较具体,都是c++一些特有的功能,在一些特定情况下作用非常大。

函数 默认参数

简而言之就是:调用该函数时,有些参数可以省略,函数自动使用其默认的参数。

int add(int a, int b = 1);   //如果不输入b对应的参数,则默认b等于1

int x = 9, y = 10;
sum = add(x, y);  //这是传统方式
sum = add(x);     //后面一个参数没有输入,于是自动使用默认值b=1

注意:
①默认参数只在没有输入对应参数时发挥作用
②默认参数必须在参数表的右边
即:

int add(int a, int b = 1, int c = 2);  //可以
int add(int a, int b = 1, int c);      //错误!!!

函数重载(函数多态)

定义:可以定义、调用多个同名的不同函数。
理解:也就是说,我可以定义多个函数,它们函数名相同但是其内容不同。
引入“函数特征标”(function signature)概念: 函数特征标也就是函数的参数列表

函数重载的必要条件:这些同名函数的参数列表不同

void print(char * str, int width);  //①
void print(double d, int width);    //②
void print(long d, int width);      //③
void print(int i, int width);       //④
void print(const char * str);             //⑤


print ("Pancake", 15);  //自动匹配调用了① 
print ("Syrup");        //自动匹配调用了⑤
print (1999.0, 10);     //自动匹配调用了②
print (1999, 12);       //自动匹配调用了④
print (1999L, 15);      //自动匹配调用了③

注意:
①:匹配时不区分const非const变量,不区分类型引用类型本身
②:和返回类型无关,特征标必须不同

函数模板

(一)

为什么c++要新增这样一个特性呢,带着问题出发。
试想这样一个简单问题:
我定义了这样一个函数

int function1(int a, int b)
{
	int c = 2*a + b;
	return c;
}

但我现在想解决两个问题:

int a, int b;       // 想计算2*a + b
double c, double d; // 想计算2*c + d

难道复制function1的内容,然后把每个 int 换成 double ,另建一个函数?

NO!!!

c++增加了函数模板这个特性

template <typename AnyType>    //template <class AnyType> 效果一样,class和typename都行
AnyType function1(AnyType a, AnyType b)
{
 AnyType c = 2*a + b;
 return c;
}
template <typename AnyType>
//这一句不能单独出现,其后面一行必须紧跟着函数声明或者函数定义
//template <typename XXXXX>   这里XXXXX是自己写的,其余的是固定搭配

看看具体的例子

template <typename T>
void Swap(T &a, T &b);

int main()
{
	...
	int i = 10;
	int j = 20;
	Swap(i, j);

	double x = 24.5;
	double y = 81.7;
	Swap(x, y);
	...
}

template <typename T>
void Swap(T &a, T &b)
{
	T temp;
	temp = a;
	a = b;
	b = temp;
}

注意:
函数模板的参数表并不要求全是模板参数类型,比如

template <typename T>
void Swap(T &a, T &b, int c); //可以有模板类型 T, 也可以有基本类型 int
(二)

虽然我们解决了上面提出的问题,但是我们是贪心的,这个函数模板仍然有局限性,就是:
比如我们定义了一个结构体:

stuct people
{
	char name[10];
	int age;
	double weight;
}

我们现在依然想使用交换函数,但是只交换该结构体的 age 和 weight 项。
于是我们引入显性具体化模板函数

stuct people
{
 char name[10];
 int age;
 double weight;
}

template <typename T>
void Swap(T &a, T &b, int c); 

template <> void Swap<people>(people &p1, people &p2);  //显示具体化模板函数

int main()
{
	...
	int i = 10;
	int j = 20;
	Swap(i, j);
	
	people chen = {"chenjing", 24, 69};
	people zhou = {"zhoudong", 24, 50};
	Swap(chen, zhou);  //由于其参数表,自动会匹配 显示具体化模板函数,而不是模板函数
	...
}

template <typename T>
void Swap(T &a, T &b)
{
	T temp;
 	temp = a;
 	a = b;
	b = temp;
}

template <> void Swap<people>(people &p1, people &p2)
{
	//此处代码交换p1、p2中的后两项内容
}

理解实例化具体化,还没理解清楚,留作以后思考

(三)

再次贪心,思考这样一个问题

template <typename T1, typename T2>
void Swap(T1 x, T2 y)
{
	???type xpy;    //该用什么类型呢???
	xpe = x + y;
}

int + double = double;
short + int = int;

所以在这个函数里面无法定义xpy的类型。
于是引入了关键字 decltype

int x;
decltype(x) y;    //定义与 x相同的类型的变量 y

int x;
double y;
decltype(x+y) z;  //定义与 (x+y) 相同的类型的变量 y

这样就完美解决了上述问题

template <typename T1, typename T2>
void Swap(T1 x, T2 y)
{
	decltype(x+y) z;    //解决问题
 	z = x + y;
}

这篇博客写的不错,挺满意!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值