auto power(double x,int n)->double 函数的返回类型放在函数头中“->”后面,称为拖尾返回类型。
数组是函数中唯一不能按值传递的类型
虽然rvalue引用形参可以引用一个rvalue-即表达式的临时结果,但rvalue引用形参本身并不是一个rvalue,而是一个lvalue
可以将函数定义成能够接受任意数量的实参,将省略号(3个句点)写在函数定义中形参列表的最后,即可表示调用该函数时可以提供数量可变的实参。
int sum(int count,...) va_list类型是在cstdarg头文件中定义的,该指针用来依次指向各个实参
{ va_start宏用来初始化arg_ptr,使其指向列表中的第一个实参。
va_list arg_ptr; 宏的第二个实参是函数形参列表中省略号前面固定形参的名称,用来确定第
va_start(arg_ptr,count); 一个可变实参的位置。
for(int i {};i<count;i++) va_arg宏返回arg_ptr指向的位置存储的实参值,并使arg_ptr递增,以指向
sum+=va_arg(arg_ptr,int); 下一个实参值,第二个实参是第一个形参的类型
va_end(arg_ptr); 重置arg_ptr
return sum;
}
在函数中动态申请内存空间并不会随着该函数的结束而消失毁灭,直到delete才会被销毁。
通常情况下,程序应该由大量小函数,而非少量大函数组成。
指针可以存储函数的地址,可以通过指针来调用函数,称为函数指针,
函数指针的通用形式为:return_type (*pointer_name) (list of_parameter_types);指针的括号为必须的!
函数指针的声明有三部分组成:指向函数的返回类型,指针名称,指向函数的形参类型
如同指向变量一样,必须确保在调用函数前初始化函数指针,如果没有初始化,则必定会出现灾难性故障。
long product(long a,long b);
long (*pdo_it)(long,long);
pdo_it=product;//函数指针初始化
pdo_it(3,5);//调用函数
函数指针的数组
double sum(const double,const double);
double product(const double,const double);
double differenct(const double,const double);
double (*pfun[])(const double,const double){sum,product,differenct};
要调用指针数组第二个元素,则可以pfun[1](2.5,3.5);
异常不能替代程序中应该有的数据检查和验证,异常真正适用于可能出现异常并且接近致命状态的环境。
try-标识可能出现异常的代码块,try块后面必须紧跟至少一个catch块。
throw-使异常状态产生,并抛出特定类型的异常
catch-标识处理异常的代码块
try
{
cout<<endl<<"Hour"<<++hour;
if(0==count)
throw "zero count -calculation not
possible";
cout<<"minutes per item:"<<time/cout;
}
catch(const char aMessage[])
{
cout<<endl<<aMessage<<endl;
}
当执行throw语句时,控制权立即传递给catch代码块中的第一条语句,因此抛出异常时将绕过除法的语句
如果希望使某个catch代码块处理try代码块中抛出的任何异常,则必须将省略号放入异常声明的圆括号之间:
catch(...)
{
}
捕获异常时,可能希望把它传送给调用程序,执行某些附加操作,而不是在catch块中处理,此时可以
catch(type2 ex)
{
throw;
}
使用没有操作数的throw,会重新抛出要处理的异常,在catch块中,只能使用没有操作数的throw,重新抛出异常会使外部的try/catch块或该函数的调用者捕获异常
new操作符抛出的异常是std::bad_alloc,bad_alloc是new标准头文件定义的类型
函数重载允许使用相同的函数名定义多个函数,条件是函数的形参列表各不相同,不同的返回类型不足以区别函数
所有函数都有签名,函数的签名由名称和形参列表确定,程序所有函数都必须有唯一的签名,否则不能编译程序
函数模板
template<typename T>T max(const T x[],const size_t len)
{
T maximum{x[0]};
for(size_t i{1};i<len;i++)
if(maximum<x[i])
maximum=x[i];
return maximum;
}
函数模板定义中任何出现T的位置,都将由创建该模板的实例时提供具体的类型实参
使用模板不能减小已编译程序的大小,编译器生成需要的每一个函数的源代码版本,使用时直接调用