1.函数指针的概念
指针可以指向函数的地址,该功能可以通过指针来调用函数,最近一次赋给指针的地址所包含的函数将被调用。
2.如何定义和使用函数指针
声明函数指针的通用形式如下: return_type (*pointer_name)(list_of_parameter_types);
初始化函数指针:long sum(long num1, long num2);
long(*pfun)(long, long) = sum;
也可以这样初始化:auto pfun = sum;
函数指针可以作为实参。
3.如何定义和使用函数指针的数组
如同常规指针一样,可以用相同的方式来声明函数指针的数组,还可以在声明语句中将它们初始化。
例如:double sum(double, double);
double product(double,double);
double difference(double, double);
double (*pfun[3])(double,double) = { sum, product, difference };
为了使用该指针数组的第二个元素调用product()函数,可以这样写:pfun[1](2.5, 3.5);
4.异常的概念,如何编写处理异常的异常处理程序
异常是标志程序中发生的错误或意外状态的方法。
异常机制使用了3个新的关键字:try-标识可能出现异常的代码块。try块后面必须紧跟至少一个catch块。
throw-使异常状态产生,并抛出特定类型的异常。
catch-标识处理异常的代码块。在前面的try块中抛出异常时,执行catch块,其中try块的类型用catch关键字后面圆括号中的内容来指定。 try块可以后跟几个catch块,每个catch块捕获不同类型的异常。
5.如何编写多个同名函数,以自动处理不同类型的数据
使用函数重载,函数重载允许使用相同的函数名定义多个函数,条件是这些函数的形参列表各不相同。当调用函数时,编译器基于提供的实参列表选择正确的版本。
6.函数模板的概念,如何定义和使用函数模板
可以创建一种方法,让编译器自动生成形参类型不同的函数,定义用于生成一组函数的方法的代码称为函数模板。
函数模板有一个或多个类型形参,通过为模板的每个形参提供具体的类型实参来生成具体的函数。因此,函数模板生成的函数都有相同的基本代码,但因为提供的类型实参而各不相同。
例如:template<class T> T max(T x[], int len){} 或者 template<typename T> T max(T x[], int len){}
decltype操作符可以得到一个表达式的类型,实际使用例如:
template<class T1, class T2>
auto f(T1 v1[], T2 v2[], const size_t& count) -> decltype(v1[0] * v2[0]){
decltype(v1[0]*v2[0]) sum(0);
for(size_t i = 0; i < count; i++) sum += v1[i] * v2[i];
return sum;
}
7.如何使用多个函数编写有实际价值的程序
函数指针:函数指针存储函数的地址,还包括函数形参的数量与类型以及返回类型等信息。
异常:异常是一种使错误处理代码与正常操作代码分开的通知程序出错的方法。
抛出异常:在使用关键字throw的语句中抛出异常。
try代码块:可能抛出异常的代码应该放在try代码块内,处理具体异常类型的代码应该放在紧跟try代码块的catch代码块内。一个try代码块后面可能有多个catch代码块,各自捕获不同类型的异常。
重载函数:重载函数是名称相同但形参列表不同的函数。
调用重载函数:当调用重载函数时,编译器基于指定的实参数量和类型,选择调用函数。
函数模板:函数模板是自动生成重载函数的方法。
函数模板形参:函数模板有一个或多个作为类型变量的形参。编译器为每个与函数模板的类型实参相对应的函数调用创建该模板的实例-即函数定义。
函数模板实例:通过在原型声明中指定所需的函数,可以强制编译器根据函数模板创建某个具体的实例。
decltype操作符:decltype操作符产生表达式求值结果的类型。
拖尾返回类型:当模板函数的返回类型取决于特定的模板形参时,可以使用auto关键字指定返回类型,在函数头的->后面用decltype操作符来定义返回类型。