• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Pencil.C++

            更新速度可能會晚于http://blog.csdn.net/bilaopao

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              34 隨筆 :: 0 文章 :: 40 評論 :: 0 Trackbacks

            #

                 摘要:   閱讀全文
            posted @ 2009-06-09 00:06 Pencil.C++ 閱讀(624) | 評論 (0)編輯 收藏

            一、外掛的分類

            外掛一般的分為2類,脫機式 和 內掛式。

            脫機式外掛的定義:完全脫離官方發布的客戶端程序,可以與游戲服務器自由的進行通訊的外掛程序,這類外掛的實現是2類外掛里最困難的,主要難點在于外掛制作者需要對游戲的通訊協議進行充分的分析,包括解決封包的加密解密問題,使得封包合法化,這樣游戲服務器才能接受并處理。

            內掛式外掛的定義:內掛需要以官方發布的客戶端程序為載體,依靠客戶端程序來完成與游戲服務器的通訊,主要通過反匯編手段分析并修改客戶端代碼后實現功能,一般通過直接調用游戲客戶端的發包函數進行發包,或者調用游戲客戶端的封包加密解密函數自行處理發包收包。


            二、制作外掛常用的技術手段

               制作外掛一般使用的分析工具:
            動態分析 OllyDbg(OllyICE)
            靜態分析 IDA Pro

               制作外掛一般使用的開發工具:
            VisualStdio系列(VC++,VB)
            Borland系列(Delphi,BCB,BC++)
            中國人自己的開發工具(易語言)(編者注:此開發工具優勢在于控件種類上,有專門的用于外掛制作的控件)

               制作外掛的技術要點:
            鼠標鍵盤模擬技術:這類技術在RING3層可通過調用WIN32 API實現,在RING0層可通過驅動模擬鼠標鍵盤輸入來實現。按鍵精靈就采用在RING0層通過驅動來模擬鼠標鍵盤,比較底層。

            Hook技術:包括API HOOK 、普通的對游戲代碼進行HOOK等。這類技術有個特點,對目標進程的代碼會進行修改。

            腳本技術:擴充外掛功能的技術之一,能讓外掛使用者編寫腳本來擴充外掛功能。

            三、反外掛中常用的技術手段

            反外掛一般使用的分析工具:
            動態分析 OllyDbg(OllyICE)
            靜態分析 IDA Pro

            制作反外掛一般使用的開發工具:
            依據游戲客戶端采用的開發工具來決定。

            制作反外掛的技術要點:
            代碼校驗:包括磁盤代碼及內存代碼校驗,防止代碼被非法更改。

            虛擬機保護:虛擬機(VM )其實就是Virtual Machine的縮寫,這里說的VM并不是像VMWare那樣的虛擬機,而是將一系列的指令解釋成bytecode(字節碼)放在一個解釋引擎中執行,能有效的干擾非法調試者對保護的代碼進行分析。是反外掛技術中的重中之重。

            驅動保護:采用底層鉤子技術,一般采用SSDT HOOK來對游戲進程進行保護。但這種技術有一個致命的缺陷,就是兼容性問題。

            反調試:對調試過程產生干擾,阻止非法調試者進行正常的調試。反調試代碼加多后會導致兼容性穩定性出現問題。

            四、一般保護的思路及步驟

               防止脫機式外掛:
            合理的設計封包通訊協議及對封包加密解密算法進行虛擬機保護能有效的防止脫機外掛,反脫機外掛的難度比較低。而且技術要求也不高。

               防止內掛式外掛:
            反該類外掛主要從代碼校驗上著手,并配合虛擬機保護,必要時候加上簡單的驅動。簡單的可以采用如下步驟處理:
            (1)        將封包加密解密獨立成一個動態連接庫(DLL),供游戲主程序調用進行封包加解密。
            (2)        更換封包加密解密方式,防止破解者采用替換舊客戶端的方式進入游戲。
            (3)        反外掛功能在獨立出來的動態連接庫里實現,在獨立出來的動態連接庫中加入對主程序代碼段校驗。建立一個新的反外掛線程來校驗代碼段,加入敵意進程或模塊的特征檢測,對關鍵的API進行檢測。檢測到非法可以對服務器進行報告,并在客戶端主動切斷與游戲服務器的連接。
            (4)        在加密解密函數里加入對反外掛線程的檢測,檢測反外掛線程是否正常運行,如果檢測到非法情況,同樣對服務器進行報告并主動切斷與游戲服務器的連接。
            (5)        對獨立出來的DLL進行虛擬機保護(封包加解密及反外掛線程代碼)。
            (6)        加入一些反調試技術。
            (7)        根據實際情況采用驅動技術,對游戲進行保護。

            五、對反外掛工作的建議
            反外掛工作具有長期性,復雜性等特性,故建立專門進行此類工作的軟件安全小組是必須的,及時的收集外掛后分析外掛的所使用的技術和破解反外掛系統的方式,寫出相應的檢測及防護代碼,提交后進行游戲更新。通過不斷的完善反外掛系統,我有理由堅信,外掛會在這樣的保護措施下銷聲匿跡。
            posted @ 2009-06-08 23:29 Pencil.C++ 閱讀(833) | 評論 (0)編輯 收藏

            ■1.FindWindow:這個函數返回游戲窗口的句柄。參數lpClassName為游戲的類名(像neoragex這個模擬器的類名為"neoragex",winamp的類名為"Winamp v1.x"),程序的類名可以用game master 獲得或自己編程獲得,如果實在得不到的話就設為vbNullstring ;參數lpWindowName 為游戲窗口的標題,如果lpClassName設為vbNullstring的話,這個一定要完整,不然將得不到正確的句柄。
            ■2.GetWindowThreadProcessId:獲得游戲的進程標識符。參數hwnd 是findwindow 返回的游戲窗口的句柄;參數lpdwProcessId 就是函數獲得的進程標識符,等一下openprocess 要用到的。
            ■3.openprocess:用來得到游戲進程句柄,參數dwDesiredAccess 的值決定了句柄對進程的存取權利,要設為PROCESS_ALL_ACCESS(完全存取權限);如句柄能夠由子進程繼承,則把參數bInheritHandle 設為True,而我們要設為False ;dwProcessId 為所要打開游戲的進程標識符,就是用GetWindowThreadProcessId 獲得的那個。
            ■4.WriteProcessMemory :這個函數可是重中之重呀,它用來寫游戲內存中指定地址的值。參數hProcess 是想要寫的游戲的進程句柄,就是由上面的openprocess函數得到(你想寫neoragex 這個模擬器的內存數據,就必須得到neoragex 的進程句柄,就像你想去銀行保險箱取錢,你必須知道究竟哪個保險箱是你的一樣); 參數lpBaseAddress 是你想修改的游戲的內存地址,像KOF99中1P 人物生命值的地址的十六進制是567BC0,在VB 中,在數字的前面加&H 表示十六進制,在上面的程序中就是&H567BC0 ;參數lpBuffer 是地址的值;參數nSize 是希望寫入lpBaseAddress 的字節數,如果你寫入的值是Byte,則應為1 ,如果是I n t e g e r ,則應為2 ,以此類推;參數lpNumberOfBytesWritten 不用管它,一般設為0& 即可。
            ■5 . R e a d P r o c e s s M e m o r y :這個跟上面的WriteProcessMemory 用法差不多,它是用來讀取指定游戲內存中指定地址的值的。
            ■6.CloseHandle :用來關閉每一個打開的進程句柄。剩下的那些就算是菜鳥都能看得懂,我就不廢話了。有了這六個強大的API函數,你還怕鑄不出絕世的好“劍”?上面這個源程序只是一個簡單的例子,憑大家的聰明才智,肯定能做出更加強大的修改器。
            posted @ 2009-06-06 16:29 Pencil.C++ 閱讀(257) | 評論 (0)編輯 收藏

            程序源碼如下.

            /////////////////////////////////////////////////////////////////////
            #include   "windows.h "
            #include   "WinIo.h "
            #include   "winuser.h "
            #include   "iostream.h "
            #define   VK_A   0x41

            #define   KBC_KEY_CMD   0x64         //鍵盤命令端口
            #define   KBC_KEY_DATA   0x60       //鍵盤數據端口


            void   KBCWait4IBE()
            {
            DWORD   dwRegVal=0;
            do
            {  
            GetPortVal(0x64,&dwRegVal,1);
            }
            while(dwRegVal   &   0x00000001);
            }

            void   MyKeyDownEx(long   vKeyCoad)       //模擬擴展鍵按下,參數vKeyCoad是擴展鍵的虛擬碼
            {
            long   btScancode;
            btScancode   =   MapVirtualKey(vKeyCoad,   0);

                    KBCWait4IBE();       //等待鍵盤緩沖區為空
                    SetPortVal(KBC_KEY_CMD,   0xD2,   1     );       //發送鍵盤寫入命令
                    KBCWait4IBE();
                    SetPortVal(KBC_KEY_DATA,   0xE0,   1   );   //寫入擴展鍵標志信息
                   
                   
                    KBCWait4IBE();       //等待鍵盤緩沖區為空
                    SetPortVal(   KBC_KEY_CMD,   0xD2,   1   );         //發送鍵盤寫入命令
                    KBCWait4IBE();
                    SetPortVal(   KBC_KEY_DATA,   btScancode,   1   );   //寫入按鍵信息,按下鍵
            }


            void   MyKeyUpEx(long   vKeyCoad)       //模擬擴展鍵彈起
            {
            long   btScancode;
            btScancode   =   MapVirtualKey(vKeyCoad,   0);

                    KBCWait4IBE();       //等待鍵盤緩沖區為空
                    SetPortVal(KBC_KEY_CMD,   0xD2,   1   );         //發送鍵盤寫入命令
                    KBCWait4IBE();
                    SetPortVal   (KBC_KEY_DATA,   0xE0,   1   );   //寫入擴展鍵標志信息
                   
                   
                    KBCWait4IBE();     //等待鍵盤緩沖區為空
                    SetPortVal(KBC_KEY_CMD,   0xD2,   1   );         //發送鍵盤寫入命令
                    KBCWait4IBE();
                    SetPortVal(KBC_KEY_DATA,   (btScancode   |   0x80),   1);     //寫入按鍵信息,釋放鍵
            }

            void   MyKeyDown(long   vKeyCoad)
            {
            long   byScancode   =   MapVirtualKey(vKeyCoad,0);  
            KBCWait4IBE();//等待鍵盤緩沖區為空  
            if(SetPortVal(0x64,0xD2,1)==false)cout < < "發送鍵盤寫入命令失敗! " < <endl;//發送鍵盤寫入命令

            KBCWait4IBE();//等待鍵盤緩沖區為空  
            if(SetPortVal(0x60,(ULONG)byScancode,1)==false)cout < < "按下鍵失敗! " < <endl;//寫入按鍵信息,按下鍵
            }


            void   MyKeyUp(long   vKeyCoad)
            {
            long   byScancode   =   MapVirtualKey(vKeyCoad,0);  
            KBCWait4IBE();//等待鍵盤緩沖區為空  
            if(SetPortVal(0x64,0xD2,1)==false)cout < < "發送鍵盤寫入命令失敗! " < <endl;//發送鍵盤寫入命令

            KBCWait4IBE();//等待鍵盤緩沖區為空  
            if(SetPortVal(0x60,(ULONG)(byScancode   |   0x80),1)==false)cout < < "釋放鍵失敗! " < <endl;//寫入按鍵信息,釋放鍵
            }


            void   main()
            {
            if(InitializeWinIo()==false)cout < < "驅動程序加載失敗! " < <endl;

            Sleep(3000);

            MyKeyDownEx(VK_LEFT);       //按下左方向鍵
            Sleep(200);                         //延時200毫秒
            MyKeyUpEx(VK_LEFT);           //釋放左方向鍵  
            Sleep(500);
            MyKeyDown(VK_SPACE);       //按下空格鍵,注意要發送兩次
            MyKeyDown(VK_SPACE);
            Sleep(200);
            MyKeyUp(VK_SPACE   )   ;       //釋放空格鍵

            ShutdownWinIo();
            }
            posted @ 2009-06-06 01:46 Pencil.C++ 閱讀(4120) | 評論 (6)編輯 收藏

            1.命名管道
            2.匿名管道
            3.郵槽
            4.剪貼板
            5.WM_COPYDATA
            6.WM_SETTEXT
            7.數據共享
            8.Socket

            說說最簡單的WM_COPYDATA
            你可以向一個窗口發送WM_COPYDATA消息,用SendMessage
            比如你向一個窗口通宵,想發送一個字符串"CIW_BLUE"給另外一個窗口,可以這樣:
            COPYDATASTRUCT stCopyData = {0};
            stCopyData.lpData = "CIW_BLUE";
            stCopyData.cbData = strlen("CIW_BLUE")+ 1;
            SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&stCopyData);

            你在接受的程序里面響應WM_COPYDATA消息就OK
            lParam 是一個COPYDATASTRUCT的指針
            posted @ 2009-06-02 20:42 Pencil.C++ 閱讀(313) | 評論 (0)編輯 收藏

                 摘要:   閱讀全文
            posted @ 2009-04-26 15:15 Pencil.C++ 閱讀(558) | 評論 (2)編輯 收藏

            20. 格式化輸入和輸出:        例題從 167開始
                 A.設置流的格式化標志
                    1).控制格式的標志位
                     ------------------------------------------------------------------------------
                       標志位 |   值                             含義               |輸入/輸出
                     ------------------------------------------------------------------------------
                      skipws  | 0x0001 |                 跳過輸入中的空白符                   i
                     ------------------------------------------------------------------------------
                       left   | 0x0002 |                 輸出數據左對齊                       o
                     ------------------------------------------------------------------------------
                      rignt   | 0x0004 |                 輸出數據右對齊                       o
                     ------------------------------------------------------------------------------
                     internal | 0x0008 |   數據的符號左對齊,數據本身右對齊,之間為填充符     o
                     ------------------------------------------------------------------------------
                       dec    | 0x0010 |              轉換基數為十進制形式                   i/o
                     ------------------------------------------------------------------------------
                       oct    | 0x0020 |              轉換基數為八進制形式                   i/o
                     ------------------------------------------------------------------------------
                       hex    | 0x0040 |             轉換基數為十六進制形式                  i/o
                     ------------------------------------------------------------------------------
                     showbase | 0x0080 |                輸出數據前有0/0x                      o
                     ------------------------------------------------------------------------------
                    showpoint | 0x0100 |              浮點數輸出帶有小數點                    o
                     ------------------------------------------------------------------------------
                    uppercase | 0x0200 |           用大寫字母輸出十六進制數值                 o
                     ------------------------------------------------------------------------------
                     showpos  | 0x0400 |               正數前面有“+”號                      o
                     ------------------------------------------------------------------------------
                    scientfic | 0x0800 |            浮點數輸出采用科學表示法                  o
                     ------------------------------------------------------------------------------
                      fixed   | 0x1000 |            使用定點數形式表示浮點數                  o
                     ------------------------------------------------------------------------------
                     unitbuf  | 0x2000 |        完成輸入操作后立即刷新流的緩沖區              o
                     ------------------------------------------------------------------------------
                      stdio   | 0x4000 |         完成輸入操作后刷新系統的stdout               o
                     ------------------------------------------------------------------------------    
                   2).使用成員函數設置標志字:
                       1.long flags()       //該函數用來返回標志字
                       2.long flags(long)   //該函數使用參數更新標志字,返回更新前的標志字
                       3.long setf(long setbits,long field)//將field所指定的標志清零,將setbits為1的位置1,返回以前的標志字
                       4.long setf(long)  //設置參數所指定的那些標志的位,返回更新前的標志字
                       5.long unsetf(long)//該函數用來清除參數所指定的那些標志位的位,返回更新前的標志字
                    在ios類中,定義了下面的表態類對象;
                       static const long  basefield; //其值為dec/oct/hex
                       static const long adjustfield //其值為left/right/internal
                       static const long  floatfield //其值為scientific/fixed
                    example:  cin.setf(ios::dec,ios::basefield      
                B.格式輸出函數:
                   1).設置輸出數據所占寬度的函數
                       1.int width()//該函數返回當前輸出數據的寬度
                       2.int width(int)//刻函數用來設置當前輸出數據的寬度為參數值,并返回更新前的寬度值
                   2).填充當前寬度內的填充字符函數
                       1.char fill()//該函數用來返回當前所使用的填充字符
                       2.char fill(char)//該函數用來設置填充字符為參數值所表示的字符,并返回更新前的填充字符
                   3).設置浮點數輸出精度函數
                       1.int precision()//該函數返回當前浮點數的有效數字的個數
                       2.int precision(int)//該函數設置浮點數輸出時的有效數字個數,并返回更新前的值。
                  注意:float型實數最多提供7位有效數字,double型褸最多提供15位有效數字,long。。。提供19位有效數字
               C.操作子:為了簡化操作,提供了一系列操作子,操作子實際上是對象
                   --------------------------------------------------------------------
                    dec             數值數據采用十進制表示                 i/o
                   --------------------------------------------------------------------
                    hex             數值數據采用十六進制表示               i/o
                   --------------------------------------------------------------------
                    oct             數值數據采用八進制表示                 i/o
                   --------------------------------------------------------------------
                    setbase(int)|  設置數據轉換基數為n(n為0,8,10,16),其中0表示缺省基數  i/o
                   --------------------------------------------------------------------
                    ws           提取空白符                                 i
                   --------------------------------------------------------------------
                    ends         插入空白符                                 o
                   --------------------------------------------------------------------
                    flush       刷新與流相關聯的緩沖區                      o
                   --------------------------------------------------------------------
                    resetiosflags(long)     清除參數所指定的標志位         i/o
                   --------------------------------------------------------------------
                    setiosflags(long)       設置參數所指定的標志位         i/o
                   --------------------------------------------------------------------
                    setfill(int)            設置填充字符                    o
                   --------------------------------------------------------------------
                    setsprecision(int)      設置浮點數輸出的有效數字個數 |     o
                   --------------------------------------------------------------------
                    setw(int)               設置輸出數據項的域寬            o
                   --------------------------------------------------------------------
            21. 字符串流:例170開始
                  c++提供了兩個類:頭文件#include"strstrea.h"
                     1.ostrstream:其是從ostream派生來的,將不同類型轉換為字符串,并存放到數組中.
                         ostrstream::ostrstream();//缺省構造函數,它用來建立存儲所插入的數據的數組對象;
                         ostrstream::ostrstream(char *s,int n,int mode=ios::out);//此構造函數中S是字符指針或字符數組,N是用來指定這個數組最多能存放的字符個數.mode參數給出流式的方式,缺省為out方式,還可選用ate和app方式.
                       ostrstream類還提供了如下的成員函數:
                         int ostrstream::pcount();//返回流中已插入的字符個數;
                         char *ostrstream::str(); //返回標志字符串的數組的指針值;
                     2.istrstream:其是從istream派生來的,將文本項轉換為變量所需要的內部格式.     
                         istrstream::istrstream(char *s);//構造函數中S是一個字符指針或字符數組,使用該串來初始化要創建的流對象
                         istrstream::istrstream(char *s,int n);//此構造函數是使用串中前N個字符來構造串對象
            22.異常處理
                  try{   }
                  throw 變量
                  catch(形式參數變量){   } //其中形數參數變量只能是一個,且類型不能像函數傳遞形參那樣進行自動轉換,必須完全批配
               注意:1.當找不到指導配項時,就用黑認批配項abort()一終止程序               
                     2.異常處理的數據類型是公有基類,拋擲異常的數據類型是派生類
                     3.異常處理的數據類型是指向公有基類的指針,拋擲異常的數據類型是指向派生類的指針
                        catch(基類)總能夠捕獲throw(派生類對象),所以catch(基類)塊總是放在catch(派生類)塊的后面,以避免catch(派生類)永遠不能捕獲異常
            posted @ 2009-04-24 19:34 Pencil.C++ 閱讀(143) | 評論 (0)編輯 收藏

            19.磁盤文件的輸入。頭文件#include"fstream.h"  //例題從156開始從156開始   &
                1.打開文件:
                     a.   fstream outfile;
                          outfile.open("f1.txt",ios::out);//其中fstream為系統對文件專用操作類從156開始   &
                     b.   ofstream ostream("f1.txt");
                          ofstream ostrm;  ostrm.open("f1.txt");//表示打開某個寫文件
                     c.   ifstream istrm("f2.txt");defstream.h  例題
                          ifstream istrm;  istrm.open("f2.txt");//表示打開某個讀文件
                  -----------------------------------------------------------------------
                              方式名                        用途19.磁盤文件的輸入。頭文件#inclu
                  ----------------------------------------------------------------------
                               in                        以輸入方式打開文件
                  -----------------------------------------------------------------------19.磁盤文件的輸入。頭文件#inclu
                               out                       以輸出方式打開文件
                  -----------------------------------------------------------------------  
                        app                       以輸出追加方式打開文件defstream.h  例題
                  -----------------------------------------------------------------------
                              ate                       文件打開時,文件指針位于文件尾
                  -----------------------------------------------------------------------defstream.h  例題
                               trunc              如果文件存在,將其長度截斷為零,并清除所有內容,如果文件不存在,則創建新文件
                  -----------------------------------------------------------------------
                               binarg              以二進制方式打開文件,缺省時為文本方式nbsp; 1.打開文件:  
                  -----------------------------------------------------------------------
                               nocreate           |打開一個已有文件,如該文件不存在,則打開失敗
                  -----------------------------------------------------------------------從156開始   &
                               noreplace          |如果文件存在,除非設置 ios::ate或ios::app,否則打開失敗
                  -----------------------------------------------------------------------
                               ios::in |ios::out  |以讀和寫的方式打開文件defstream.h  例題
                  -----------------------------------------------------------------------
                             ios::out|ios::binary |以二進制方式打開文件
                  -----------------------------------------------------------------------   &n
                             ios::in|ios::binary  |以二進制方式打開文件
                  -----------------------------------------------------------------------
                2. 關閉文件:從156開始   &
                          fstream outfile;
                          outfile.close();  
                3. 打開文件失敗退出程序:用函數abort();退出,在頭文件<stdlib.h"defstream.h  例題
                4.判斷文件結束函數.example:  infile.eof()
                5.getline(char*,sizeof(s));//讀取一串字符
                  get()/put()//對文件字符操作,例如outfile.get  defstream.h  例題
                6.隨機訪問數據文件:
                    1)讀指針
                      istream &istream::seekg(流中位置)//   &n
                      istream &istream::seekg(偏移量,參照位置)//參照位置分為:cur=1/beg=0/end=2  input.seekg(-100,ios::cur);
                      streampos istream::tellg();//其中streampos定義為long型,它返回一個long型且值為當前指針離文件開頭的位置(字節數)
                    2)寫指針defstream.h  例題
                      ostream &ostream::seekp(流中的位置)
                      ostream &ostream::seekp(偏移量,參照位置)//參照位置同上
                      streampos ostream::tellp();   &n
                 注意:讀函數中有get(),寫函數中有put(),操作讀指針用seekg(),而寫指針用seekp();write()和read()中的第一個參數必須為(char *),如果不是,一定要強制轉換
                7.  while(!cin);//表示輸入流有錯。
                    cin.clear();//原型 void ios::clear(int=0);其用途是將錯誤狀態的標志字中錯誤標志位清除,重新判斷輸入。19.磁盤文件的輸入。頭文件#inclu
                    cin.ignor(80,ch);//如果ch='\n',一般表示忽略一行,重新到下一行去輸入
                    istream &istream::ignore(int n=1,int t=EOF);//跳過輸入流中指定數量的字符的函數,t為終止符,一般EOF相當于<ctrl+z>操作
                    istream &istream::pubback(char ch)//退回一個字符到輸入流的函數,其中ch是指出要退回輸入流的字符。
            posted @ 2009-04-24 19:34 Pencil.C++ 閱讀(168) | 評論 (0)編輯 收藏

            12.運算符重載:  &nbs12.運算符重載:
                  operator 函數用法:(不能有下列字符:'::','.','*','->','? :')p;   
                      1.一般:int class_name::operator <運算符> (形參列表)   (例92)
                      2.增量減量運算符:   (例93,94,95,96)
                           a.將一個增量運算符重載為前置的成員函數:12.運算符重載:  &nbs
                                       int class_name::operator++();
                           b.將一個增量運算符重載為后置的成員函數:
                                       int class name::operator++(int);12.運算符重載:  &nbs
                           c.將一個增量運算符重載為前置的友元函數:
                                       int operator ++(class_name&);         
                           d.將一個增量運算符重載為前置的友元函數:)    
                                       int operator ++(class_name&,int);     
                           e.下標運算符:
                                       int class_name::operator[](形參)  //只能是非靜態成員函數                           operator 函數用法:(不能有下
                           f.函數調用運算符: 
                                       int class_name::operator()(形參表)//只能是非靜態函數,且不可以帶有缺省的參數
                           g.成員選擇運算符:12.運算符重載:  &nbs
                                       class_name $/* class_name::operator->();
                           h.new delete運算符:
                                       void *class_name::operator new(siz_t,<arg_list>);12.運算符重載:  &nbs
                                       void *class_name::operator delete(void *,<size_t>);
                               new delete只能被重載為類的成員函數,不能是友元。而且無論是否使用關鍵字static
                               進行修飾,重載了的new和delete均為類的表態成員函數。p;   
                                   對于typedef unsigned size_t;
                               在頭文件alloc.h,mem.h,stddef.h,stdio.h,stdlib.h均說明;
                           i.友元函數: operator 函數用法:(不能有下
                                   可以是一個類的非靜態函數,也可以是類的友元函數。
                                  {friend complex operator+(complex&,complex&);
                                  }; 12.運算符重載:  &nbs
                             以下五種運算符不說明成友元運算符:
                                  "=","()","[]","->","type"; 
                           j.轉換函數: operator 函數用法:(不能有下
                                     class_name::operator type();  //type 是任何一個合法的C++的類型名(包括基本數據類型和導出數據類型)以及由關鍵字const和volatile引出的表達示。)
                                                                   //不帶任何參數,也無返回值類型,總是返回type的值。只能是類的成員函數,不能說明為友元運算符。
                           k.類的賦值運算與運算符重載:列字符:::,.,*,->,? :
                                     person & person::operator=(person &p)
                                       {dele Name;
                                        Name=new char[strlen(p.Name)+1];12.運算符重載:  &nbs
                                        strcpy(Name,p.Name);
                                        Age=p.Age;
                                        Sex=p.Sex;p;   
                                        return *this;
                                       }
                                    典型例題。當用系統自帶對象賦值的函數,如果對象里有如 *Name 型的,則賦值后會使兩個指針同時指向一個成員元素的地址,當調用析構函數釋放時,會釋放兩次,多釋放一次,而產生錯誤,這個典型例題是用于把一個成員元素復制到另一個對象中,不是單純移動指針,當調用析構函數時,會釋放兩次。12.運算符重載:  &nbs
                           l.重載函數:系統僅對形參加以區別。
            13.虛函數
                 一般情況下,指向一個對象的指針,不允許指向另一個對象,但指向基類對象的指針可以指向它的派生類,并可以訪問派生類中原基類成員。12.運算符重載:  &nbs
                 如果一個函數一旦說明為虛函數,則無論說明它的類被繼承了多少層,在每一層中該函數都保持該virturl特性。且可以在派生類中對該函數省略virtual.
                 虛函數必須是類的一個成員函數,不能是友元,但它可以是另一個類的友元。虛函數不能是一個靜態成員。
                 設定綁定方式,使程序具有靈活性,但執行效率低,占用內存多.     operator 函數用法:(不能有下
            14.抽象類:純虛函數
                  純虛函數的一般形式為:virturl 類型名(參數表)=0;抽象類不能申請對象。
            15.類屬結構:12.運算符重載:  &nbs
                   1.函數模板:template <class 模板形參表>                
                            返回值類型 函數名(模板函數形參表)
                              {)    
                               函數體;
                              }
                         example:p;   
                             template  <class T>
                             void swap(T &.x,T&.y)
                              {T t;列字符:::,.,*,->,? :
                               t=x;x=y;y=t;
                              }
                   2.重載函數模板:調用用次序:12.運算符重載:  &nbs
                        1)尋找一個完全匹配的函數,找到,調用之。
                        2)尋找一個函數模板,將其實例化產生一個匹配的模板函數,找到,調用之。
                        3)尋找重載函數中有無通過類型轉換后產生參數匹配的函數,若有,調用之。p;   
                   3.類模板:template <class 模板形參>
                             class 類模板名
                             {12.運算符重載:  &nbs
                              類體;
                             }
                         example:  tempplate <class T>12.運算符重載:  &nbs
                                   class stack
                                   {private:
                                      T *date; 12.運算符重載:  &nbs
                                      int top;
                                    public:
                                      isempty();12.運算符重載:  &nbs
                                   }
                                   template <class T>
                                   {...}   operator 函數用法:(不能有下
            16.類模板的友元:
                      a.一般的類模板友元函數。
                      b.封閉型的類模板友元函數。當用類型參數將類模板實例化為某個具體的模板類時,該類模板所包含的友元函數也將隨之實例化。列字符:::,.,*,->,? :
                      c.開放型的類模板友元函數。
                   例一百二十一。
            17.C++的I/O流庫 operator 函數用法:(不能有下
                1.  I/O標準流類  
                    -----------------------------------------
                    c++名字  設備  | C中的名字 | 默認的含義)    
                    -----------------------------------------
                    cin      鍵盤  | stdin     | 標準輸入
                    -----------------------------------------12.運算符重載:  &nbs
                    cout     屏幕  | stdout    | 標準輸出
                    -----------------------------------------
                    cerr     屏幕  | stderr    | 標準錯誤)    
                    -----------------------------------------
                    clog     | 打印機 | stdprn    打印機
                    -----------------------------------------p;   
                 2。鍵盤輸入
                    cin>>a>>b>>c;  //Ctrl+z終止
                    cin.get(char &ch)//從輸入流獲取一個字符,不忽略空格Ctrl+z終止)    
                    cout.put(ch)//輸出一個字符       
                EOF//其值為-1,相當于終止符 
                    cin.geline(char *buf,int limit,Deline='\n')//buf為一個指針或數組,limit為字符個數,Deline為讀取字符指定結束符。作用:從鍵盤讀入一串字符。結束用Ctrl+z.列字符:::,.,*,->,? :
                cin.gcount()//返回getline()剛剛讀過的字符個數 
                    cin.read(char *buf,int size)//讀入指定數目的字符
                cout.write(const char *str,int n)//cout.write("string",strlen("string");則輸出全部字符。p;   
                cin.peek()//返回輸入流的下一個字符,但是不提取它。
                long(a)//a可以是指針地址,作用,強制轉換為十進制數。
                (void*)//ex:char str="abcde";cout<<str;將str為首地址字符串的首地址輸出。   列字符:::,.,*,->,? :
            18.輸入符,提取符重載:<<  >>
                 例154 155例題
            posted @ 2009-04-24 19:33 Pencil.C++ 閱讀(239) | 評論 (0)編輯 收藏

            1.              I/O流的常用控制符 1.   
                          dec                         置基數為10
                          hex                         置基數為16
                          oct                         置基數為8; IO流的常用控制符  &n
                          setfill(c)                  設填充字符為C
                          setprecision(n)             設顯示小數精度為n位
                          setw(n)                     設域寬為N個字符; IO流的常用控制符  &n
                          setiosflags(ios::fixed)     固定的符點顯示
                          setiosflags(ios::scientific)指數表示
                          setiosflags(ios::left)      左對齊; IO流的常用控制符  &n
                          setiosflags(ios::right)     右對齊
                          setiosflags(ios::skipws)    忽略前導空白
                          setiosflags(ios::uppercase) 16進制數大寫輸出sp;   
                          setiosflags(ios::lowercase) 6進制數小寫輸出  
                          setiosflags(ios::showpoint) 顯示小數點
                          setiosflags(ios::showpos)   正數前面加上正號  &
            2.頭文件:*iostream.h*    *iomanip.h*   *stdlib.h*
                       cout/cin   流的控制符  exit(0)      
            3.指針的幾種類型: 1.   
              int (*p)();p為指向函數的指針變量,該函數帶回一個整形值
              int *p();p為帶回一個指針的函數,該指針指向整形數據
              int (**)[n]p為一個指向一個指針變量的指針變量,被指向的指針變量指向一個含n個整形數據的一維數組sp;   
            4.構造函數和析構函數特點及其區別:
               a.構造函數可以有任意個形參,還可以重載(多個參數個數不同的函數);但析構函數不能有形參,因為是系統自動調用的.
               b.構造函數不可以任意調用,只準系統調用;而析構函數不僅系統調用,也可以任意調用.                               ; IO流的常用控制符  &n
            5.構造函數和析構函數什么時候自動運行?(例61)
                      構造函數:一般在定義類對象時自動運行.
                      析構函數:如果一個函數中定義了一個對象,則在這個函數運行結束時就執行一次; 1.   
                               當一個對象是使用NEW運算符被動態創建的,在使用DELETE運算符釋放它時,DELETE將會自動調用析構函數.
                      拷貝初始化構造函數:當用tpoint N(M);語句時調用一次;
                                     當對象作為實參向形參傳遞時,即對形參初始化時執行一次;; IO流的常用控制符  &n
                                     當遇到M=return(N);語句,即對M進行初始化時調用一次;

            6.this 指針用法:例63中,當程序執行語句list elem(i);時,系統對this指針進行了如下的缺省賦值:this=&list;
                            賦值成員函數舉例(此例在例63基礎上):  &
                                  void Assign(linear_list&);//說明語句;
                                  void linear_list::Assign(linear_list&p)
                                   {if(&p==this); IO流的常用控制符  &n
                                       return;
                                    nmax=p.nmax;
                                    nelem=p.nelem;; IO流的常用控制符  &n
                                    list=new int[nmax];
                                    for(int i=0;i<nmax;i++)
                                       list[i]=p.list[i];  &
                                   
            7.const,volatile對象和const,volatile成員函數
              格式:const person per/volatile person per;                        1.   
                   int func(int) const;/char func(int) volatile;
              說明:1.普通對象既可以訪問const對象,又可以訪問volatile對象;
                   2.const對象只能訪問用const修飾的成員函數;sp;   
                     volatile對象只能訪問用其所長volatile修飾的成員函數;
                   3.也可以同時說明為const volatile對象或const volatile成員函數;
                     const volatile對象只能訪問const volatile成員函數;nbsp;  &nb
                     const/volatile對象也能訪問const volatile成員函數;
            8.不同繼承方式的基類和派生類特性
              ------------------------------------------------  &
               繼承方式       基類特性        派生類特性
              ------------------------------------------------
                              public          public 1.   
               公有繼承       protected       protected
                              private         不可訪問
              ------------------------------------------------ 1.   
                              public          private
               私有繼承       protected       private
                              private         不可訪問  nbsp;  &nb
              ------------------------------------------------
                              public          protected
               保護繼承       protected       protected 1.   
                              private         不可訪問
              ------------------------------------------------
              A:幫助理解:1)對于公有繼承方式:nbsp;  &nb
                           a.基類成員對其對象的可見性:公有成員可見,其他不可見。這里保護成員同于私有成員。
                           b.基類成員對派生類的可見性:公有成員和保護成員可見,而私有成員不可見。這里保護成員同于公有成員。
                           c.基類成員對派生類對象的可見性:公有成員可見,其他成員不可見。 1.   
                        所以,在公有繼承時,派生類的對象可以訪問基類中的公有成員;派生類的成員函數可以訪問基類中的公有成員和保護成員。這里,一定要區分清楚派生類的對象和派生類中的成員函數對基類的訪問是不同的。
                        2) 對于私有繼承方式:
                           a.基類成員對其對象的可見性: 公有成員可見,其他不可見。nbsp;  &nb
                           b.基類成員對派生類的可見性:公有成員和保護成員可見,而私有成員不可見      
                           c.基類成員對派生類對象的可見性:所有成員都是不可見的。
                        所以,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承。; IO流的常用控制符  &n
                        3) 對于保護繼承方式:
                           與私有繼承方式相同,兩者的區別僅在于對派生類的成員而言,對基類成員有不同的可見性。
             B:幫助理解:1) 公有繼承時,水平訪問和垂直訪問對基類中的公有成員不受限制。; IO流的常用控制符  &n
                         2) 私有繼承時,水平訪問和垂直訪問對基類中的公有成員也不能訪問。
                         3) 保護繼承時,對于垂直訪問同于公有繼承,對于水平訪問同于私有繼承。
                         4) 對于基類中的私有成員,只能被基類中的成員函數和友元函數訪問,不能被其他的函數訪問。  &
             C:幫助理解:在公有繼承時,派生類的成員函數可訪問基類中的公有成員和保護成員;派生類的對象僅可訪問基類中的公有成員。
            9.派生類的構造函數和析構函數:
                 派構:  &
                     1.一般格式: 派生類名  (派生類構造函數總參數表):基類構造函數(參數表1),子對象名(參數表2)
                                      {派生類中數據成員初始化};
                     2.調用順序: a.基類的構造函數。b.子對象類的構造函數(如果有的話). c.派生類構造函數。                           &
            10.多繼承:是指派生類具有多個基類。
               多繼承的構造函數:
                               《派生類名》(總參數表):《基類名1》(參數表1),《基類名2》(參數表2),...nbsp;  &nb
                                   {派生類構造函數體}  
            11.虛基類:如果基類被聲明為虛基類,則重復繼承的基類在派生磁對象實例中只好存儲一個副本,否則,將出現多個基類成員副本。
               虛基類說明格式如下:  virtual<繼承方式><基類名> 1.   
                                     class B:virtual public A
              注意:a.如果一個派生類有直接或間接的虛基類,那么派生類的構造函數的成員初始列表中必須列出對虛基類的調用,如果未被列出,則表示使用該基類的缺省構造函數來初始化派生類對象中的虛基類子對象。
                    b.虛基類的構造函數先于非虛基類的構造函數調用。nbsp;  &nb
                    c.只有建立對象的那么個派生類的構造函數調用虛基類的構造函數,而該派生類的基類中所列出的對這個虛基類的構造函數的調用在執行中被忽略。

            posted @ 2009-04-24 19:32 Pencil.C++ 閱讀(170) | 評論 (0)編輯 收藏

            僅列出標題
            共4頁: 1 2 3 4 
            狠狠色婷婷综合天天久久丁香| 香蕉久久夜色精品国产2020| 久久影视国产亚洲| 99久久国产综合精品麻豆| 精品久久久久久中文字幕大豆网| 色婷婷综合久久久久中文字幕| 久久中文精品无码中文字幕| 26uuu久久五月天| 狠狠色丁香婷婷综合久久来来去| 久久精品国产只有精品66| 91久久精品视频| 久久一区二区三区免费| 久久性精品| 久久精品夜夜夜夜夜久久| 青青草原综合久久| 国产精品成人无码久久久久久| 国产亚洲色婷婷久久99精品91| 久久无码人妻精品一区二区三区 | 亚洲AV乱码久久精品蜜桃| 久久夜色精品国产噜噜亚洲AV| 久久精品国产免费| 秋霞久久国产精品电影院| 国产精品免费久久| 久久久高清免费视频| 伊人久久精品无码二区麻豆| 嫩草影院久久99| 99久久这里只精品国产免费| 中文国产成人精品久久不卡| 亚洲国产精久久久久久久| 合区精品久久久中文字幕一区| 久久99精品久久久久婷婷| 韩国三级中文字幕hd久久精品 | 免费观看成人久久网免费观看| 亚洲国产成人久久综合一区77| 91视频国产91久久久| 久久精品一本到99热免费| 国产成人精品久久二区二区| 亚洲国产一成人久久精品| 欧洲国产伦久久久久久久| 久久久久综合网久久| 久久久亚洲欧洲日产国码aⅴ|