1、排序函数
void order(int* p1, int* p2){ if(*p1 > *p2){ int temp = *p1; *p1 = *p2; *p2 = temp; } }
void sort (int *p , int len , int perLen , void (*pOrder)(void* , void*)){ char* pt = (char*)p; for(int i = 0 ; i < len ; i++){ for(int j = i ; j < len ; i ++){ pOrder(pt+i*perLen , pt+j*perLen); } } }
(1)将输入参数int* -> void* (void* 可以存储任何类型的地址,可以通用 )
(2)表示数组的第i个元素,事先要知道数组每个元素的大小(参数传入)
i*perLen => 当不知道指针类型时,表示走一步,应越过的字节数
p+i*perLen => 表示第i个元素的地址
(3)具体的数组要有具体的排序方法
调用函数,当不知道函数名时,可以通过函数指针调用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
================================================== sort.h ================================================== void sort( void * p , int len , int perLen , void (*pOrder)(void * , void * ) ); ================================================== sort.cc ================================================== void sort( void * p , int len , int perLen , void (*pOrder)(void * , void * ) ){ char* pt = (char*)p ; for( int i = 0 ; i < len ; i++ ){ for( int j = i ; j < len ; j++ ){ pOrder(pt+i*perLen,pt+j*perLen ) ; } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
================================================== main.cc ================================================== #include <iostream> #include "sort.h" using namespace std; void orderInt( void * p1 , void * p2 ){ int * t1 = (int*)p1 ; int * t2 = (int*)p2 ; if( *t1 > *t2 ){ int temp = *t1 ; *t1 = *t2 ; *t2 = temp ; } } struct Person{ char name[ 40 ] ; int age ; int id ; } ; void orderByAge( void * p1 , void* p2 ){ Person * t1 = (Person*)p1 ; Person * t2 = (Person*)p2 ; if( t1->age > t2->age ){ Person t = *t1 ; *t1 = *t2 ; *t2 = t ; } } void orderById( void *p1 , void* p2 ){ Person* t1 = (Person*)p1 ; Person* t2 = (Person*)p2 ; if( t1->id > t2->id ){ Person t = *t1 ; *t1 = *t2 ; *t2 = t ; } } void orderByName( void * p1 , void* p2 ){ Person* t1 = (Person*)p1 ; Person* t2 = (Person*)p2 ; if( strcmp( t1->name , t2->name ) > 0 ){ Person t = *t1 ; *t1 = *t2 ; *t2 = t ; } } int main(){ int ia[] = { 3,1,6,3,6,8,3,468,89 }; sort( ia , 9, sizeof(int), orderInt ); for( int i = 0 ; i < 9 ; i++ ){ cout<<ia[i] <<" " ; } cout<<endl; Person pers[ 3 ] ; pers[0].id = 1 ; pers[0].age = 29 ; strcpy( pers[0].name , "liucy" ) ; pers[1].id = 2 ; pers[1].age = 28 ; strcpy( pers[1].name , "huxinzhe" ) ; pers[2].id = 3 ; pers[2].age = 26 ; strcpy( pers[2].name , "xuehailu" ) ; sort( pers , 3 , sizeof(Person), orderByAge ); for( int i = 0 ; i < 3 ; i++ ){ cout<<pers[i].name <<","<<pers[i].age<<","; cout<<pers[i].id<<endl ; } sort( pers, 3, sizeof( Person) , orderById ) ; for( int i = 0 ; i < 3 ; i++ ){ cout<<pers[i].name <<","<<pers[i].age<<","; cout<<pers[i].id<<endl ; } sort( pers , 3 , sizeof( Person ) , orderByName ); for( int i = 0 ; i < 3 ; i++ ){ cout<<pers[i].name <<","<<pers[i].age<<","; cout<<pers[i].id <<endl; } return 0 ; }
2、面向对象
封装:对象表示
继承:更好的代码重用
多态
对象的组成 : 属性 成员变量
行为 函数
面向过程的表示方法:
数据与函数分离,关系松散
封装的作用,把数据和函数封装到一起,保证数据专用
全局函数:在类外面的函数,要使用成员变量,要通过参数传进来
成员函数:在类内,可直接使用自己类的成员变量
对于类的变量的初始化:
Person p ; strcpy(p.name , "liucy"); p.age = 23; p.speak();
对成员变量和成员函数的使用都要通过类的对象
public 关键字,表示在其他地方可以使用
默认是私有的,在main函数中不能使用
成员变量和成员函数依赖于类的对象(实例)
类型是对对象的描述
对象是类型的实例
对象自己的成员函数访问自己的成员变量
什么是类?类由什么组成?
怎么使用类?及类和对象的关系?
成员变量和成员函数归谁所有?
面向对象的方法写程序
(1)首先写一个类,描述对象
用变量表示属性,函数表示行为
(2)调用函数
创建一个类的对象,通过对象调用函数