在阅读一些经典的源代码时常碰到类似这样的代码:  
 
void  CMyCursorView::LoadCursorID(UINT  Cur)  
{  
           CurName=Cur;  
}  
 
我不理解的是,它的作用就是一个赋值,为什么不直接赋值,非要多此一举进行一次函数调用,不是降低了运行效率了吗?但是,高手们要这样写,必有它的理由吧?这理由是什么?  
 
这段代码更完整的用法是这样的:  
 
......  
       UINT  CurName;  
.......  
 
void  CMyCursorView::LoadCursorID(UINT  Cur)  
{  
           CurName=Cur;  
}  
 
void  CMyCursorView::CapPoint(CPoint  MousePos)  
{        
           CRect  r;  
           GetClientRect(&r);  
           int  Width,Hight;  
           Width=MousePos.x/(r.right/3);    
           Hight=MousePos.y/(r.bottom/3);  
           switch(Width)  
           {case  0:  
                     switch(Hight)  
                     {  
                          case  0:LoadCursorID(IDC_CURSOR1);break;  
                          case  1:LoadCursorID(IDC_CURSOR2);break;  
                          case  2:LoadCursorID(IDC_CURSOR3);break;  
                     }break;  
             case  1:  
                     switch(Hight)  
                     {  
                           case  0:LoadCursorID(IDC_CURSOR4);break;  
                           case  1:LoadCursorID(IDC_CURSOR5);break;  
                           case  2:LoadCursorID(IDC_CURSOR6);break;  
                     }break;  
             case  2:  
                     switch(Hight)  
                     {  
                           case  0:LoadCursorID(IDC_CURSOR7);break;  
                           case  1:LoadCursorID(IDC_CURSOR8);break;  
                           case  2:LoadCursorID(IDC_CURSOR9);break;  
                     }break;  
           }                  
           CUR=AfxGetApp()->LoadCursor(CurName);  
           Invalidate();  
}  
 
 
下面的这个代码与上面的语句等效,且更简洁高效,为什么不这样做?不理解!  
 
void  CMyCursorView::CapPoint(CPoint  MousePos)  
{        
           CRect  r;  
           GetClientRect(&r);  
           int  Width,Hight;  
           Width=MousePos.x/(r.right/3);    
           Hight=MousePos.y/(r.bottom/3);  
           switch(Width)  
           {case  0:  
                    switch(Hight)  
                    {  
                        case  0:CUR=AfxGetApp()->LoadCursor(IDC_CURSOR1);break;  
                        case  1:CUR=AfxGetApp()->LoadCursor(IDC_CURSOR2);break;  
                        case  2:CUR=AfxGetApp()->LoadCursor(IDC_CURSOR3);break;  
                    }break;  
             case  1:  
                    switch(Hight)  
                    {  
                        case  0:CUR=AfxGetApp()->LoadCursor(IDC_CURSOR4);break;  
                        case  1:CUR=AfxGetApp()->LoadCursor(IDC_CURSOR5);break;  
                        case  2:CUR=AfxGetApp()->LoadCursor(IDC_CURSOR6);break;  
                    }break;  
             case  2:  
                   switch(Hight)  
                   {  
                        case  0:CUR=AfxGetApp()->LoadCursor(IDC_CURSOR7);break;  
                        case  1:CUR=AfxGetApp()->LoadCursor(IDC_CURSOR8);break;  
                        case  2:CUR=AfxGetApp()->LoadCursor(IDC_CURSOR9);break;  
                   }break;  
           }                  
           Invalidate();  
}  
 
哪位高手能指点迷津?

解决方案 »

  1.   

    几个方面考虑:一是一般的变量都会声明为私有变量,给CurName赋值就需要实现这么一个函数了。你的代码里面有很多CUR=AfxGetApp()->LoadCursor(...);当然COPY/PASTE很方便,但是在其他地方再写,就没有调用函数来得方便了,且容易出错。
      

  2.   

    没记错的话你的这个程序是编程100里里面的一个小程序,其实是为了不让程序作的太死,比如再增加鼠标IDC_CURSOR资源的话直接调用LoadCursorID(UINT  Cur) 就行了,灵活呀,目的是为了提高程序的可读性和健壮性。