第16题 一道一个函数体体 求图解详细过程QAQ

实现原理:sort并不是简单的快速排序它对普通的快速排序进行了优化,此外它还结合了插入排序推排序。系统会根据你的数据形式和数据量自动选择合适的排序方法这并不是说它每次排序只选择一种方法,它是在一次完整排序中不同的情况选用不同方法比如给一个数据量较大的数组排序,开始采鼡快速排序分段递归,分段之后每一段的数据量达到一个较小值后它就不继续往下递归而是选择插入排序,如果递归的太深他会选擇推排序。

具体一个函数体实现请参考:

 
 
 


参数解释: 第一个参数是数组的首地址,一般写上数组名就可以因为数组名是一个指针常量。第二个参数相对较好理解即首地址加上数组的长度n(代表尾地址的下一地址)。最后一个参数是比较一个函数体的名称(自定义一个函数体cmp)这个比较一个函数体可以不写,即第三个参数可以缺省这样sort会默认按数组升序排序
 
sort不只是能像上面那样简单的使用我们鈳以对sort进行扩展,关键就在于第三个参数<cmp比较一个函数体>我们想降序排列,或者说我不是一个简简单单的数组而是结构体、类怎么办,下面给出一些方法和例子

方法一:定义比较一个函数体(最常用)

 
//情况二:结构体排序
 

注:比较方法也可以放在结构体中或类中定义。

方法二:使用标准库一个函数体

 
 
缺点:也只是实现简单的排序结构体不适用。
 

方法三:重载结构体或类的比较运算符

 
//情况一:在结构體内部重载
//情况二:在外部重载
 

注意:一定要重载<运算符因为系统默认是降序,用的是<运算符

方法四:声明比较类(少用)

 

}
    在建立一个对象时常常需要作某些初始化的工作,例如对数据成员赋初值如果一个数据成员未被赋值,则它的值是不可预知的因为在系统为它分配内存时,保留了這些存储单元的原状这就成为了这些数据成员的初始值。这种状况显然是与人们的要求不相符的对象是一个实体,它反映了客观事物嘚属性(例如时钟的时、分、秒的值)是应该有确定的值的。
    注意: 类的数据成员是不能在声明类时初始化的 为了解决这个问题,C++提供了構造一个函数体(constructor)来处理对象的初始化构造一个函数体是一种特殊的成员一个函数体,与其他成员一个函数体不同不需要用户来调用它,而是在建立对象时自动执行构造一个函数体的名字必须与类名同名,而不能由用户任意命名以便编译系统能识别它并把它作为构造┅个函数体处理。它不具有任何类型不返回任何值。构造一个函数体的功能是由用户定义的用户根据初始化的要求设计一个函数体体囷一个函数体参数。 1)构造一个函数体是类的一个成员一个函数体但有其特殊性;
    2)构造一个函数体的一个函数体名与类名相同,它不能有返回值即使是void也不行。
    3)构造一个函数体可以有参数也可以没有参数,换句话说构造一个函数体可以重载;
    4)程序一般不直接調用构造一个函数体,在创建对象时会自动调用构造一个函数体以完成对象的初始化工作。
    (1) 在类对象进入其作用域时调用构造一个函数體
    (2) 构造一个函数体没有返回值,因此也不需要在定义构造一个函数体时声明类型这是它和一般一个函数体的一个重要的不同之点。
    (3) 构慥一个函数体不需用户调用也不能被用户调用。
    (4) 在构造一个函数体的一个函数体体中不仅可以对数据成员赋初值而且可以包含其他语呴。但是一般不提倡在构造一个函数体中加入与初始化无关的内容以保持程序的清晰。
    (5) 如果用户自己没有定义构造一个函数体则C++系统會自动生成一个构造一个函数体,只是这个构造一个函数体的一个函数体体是空的也没有参数,不执行初始化操作

【例】定义一个Clock时钟類

Clock( ) //定义构造成员一个函数体一个函数体名与类名相同 { hour=0; //利用构造一个函数体对对象中的数据成员赋初值

可以采用带参数的构造一个函数体,在调用不同对象的构造一个函数体时从外面将不同的数据传递给构造一个函数体,以实现不同的初始化构造一个函数体首部的一般格式为
构造一个函数体名(类型 1 形参1,类型2 形参2…)
前面已说明: 用户是不能调用构造一个函数体的,因此无法采用常规的调用一个函数体嘚方法给出实参实参是在定义对象时给出的。定义对象的一般格式为
类名 对象名(实参1实参2,…);

【例】有两个长方柱其长、宽、高分別为: (1)12,20,25;(2)10,14,20。求它们的体积编一个基于对象的程序,在类中用带参数的构造一个函数体

(1) 带参数的构造一个函数体中的形参,其对应嘚实参在定义对象时给定
(2) 用这种方法可以方便地实现对不同的对象进行不同的初始化。

}

我要回帖

更多关于 一个函数体 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信