程序小设计的问题

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的位置,都将由创建该模板的实例时提供具体的类型实参

使用模板不能减小已编译程序的大小,编译器生成需要的每一个函数的源代码版本,使用时直接调用


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章