C++与C(二)

默认参数:

通过函数声明(原型,prototype)设置默认值,在函数声明时从右向左(因为调用函数时给出的实参是从左向右依次与形参匹配的)依次为参数设置默认,即在参数名后面加上=以及默认值,而函数定义时则跟没有默认参数是完全一样的。

函数多态(重载):函数名相同,但是参数列表(函数特征标,function signature)必须不同(数目不同,或者类型不同,注意:某类型的引用和某类型本身视为同一特征标)。

匹配函数时,编译器会自动进行标准类型的强制类型转换进行匹配,但是这要求某个调用函数只能匹配到一个原型,如果存在多于一个的原型能匹配时,报错,因为编译器不能抉择。

匹配函数时并不区分const和非const变量,但是如果形参是指针或者引用,则区分可行。

 函数重载不能滥用,仅当函数基本上执行相同的任务,而使用不同形式数据时才应该采用函数重载。

 

函数模板(通用编程,参数化类型,parameterized type):

函数模板允许以任意类型的方式定义函数。template <typename T>后面直接换行跟着函数名和函数体。

模板并不创建任何函数,而只是告诉编译器如何定义函数,在调用该函数时,编译器才按照模板模式创建具体类型的函数。

模板函数原型(声明):

template <typename T>

void swap(T a,T b);

 函数模板并不能缩短可执行程序,每次使用不同类型调用该模板函数时,编译器实际上都生成了对应类型的函数的,只是程序员看不到,模板只是为程序员编写通用代码提供方便,简单可靠。程序的最终代码是不包含任何模板的,只包含了为程序生成的实际函数。

 重载模板:不同类型使用不同算法完成同一项任务,可以使用重载模板。同样要求函数标不同,即函数同名,但是参数列表不同,数目不同或者参数类别不同(如引用和指针)。

 对于给定的某个函数的重载,可以有非模板函数,模板函数以及显式具体化的模板函数,其匹配优先级依次降低。

 显示具体化模板(假设job是一个struct):

 template<> void swap<job>(job a,job,b);其中swap后面的<job>可以省略。

实例化和具体化:

C++与C(二)

上一篇:^python^(1)


下一篇:C++ 自定义数据类型 二维数组