C++day08 学习笔记

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)具体的数组要有具体的排序方法
        调用函数,当不知道函数名时,可以通过函数指针调用

View Code
    ==================================================
                     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 ) ;
                 }

           }
    }                     
View Code
    ==================================================
                     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)调用函数
       创建一个类的对象,通过对象调用函数

posted @ 2012-08-04 09:49  唐小喵  阅读(196)  评论(0编辑  收藏  举报