青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

UNICODE與ANSI的區(qū)別 (轉(zhuǎn))

        什么是ANSI,什么又是UNICODE呢?其實這是兩種不同的編碼方式標(biāo)準(zhǔn),ANSI中的字符采用8bit,而UNICODE中的字符采用16bit。(對于字符來說ANSI以單字節(jié)存放英文字符,以雙字節(jié)存放中文等字符,而Unicode下,英文和中文的字符都以雙字節(jié)存放)Unicode碼也是一種國際標(biāo)準(zhǔn)編碼,采用二個字節(jié)編碼,與ANSI碼不兼容。目前,在網(wǎng)絡(luò)、Windows系統(tǒng)和很多大型軟件中得到應(yīng)用。8bit的ANSI編碼只能表示256種字符,表示26個英文字母是綽綽有余的,但是表示漢字,韓國語等有著成千上萬個字符的非西方字符肯定就不夠了,正是如此才引入了UNICODE標(biāo)準(zhǔn)。   
     在軟件開發(fā)中,特別是使用C語言的一些有關(guān)字符串處理的函數(shù),ANSI和UNICODE是區(qū)分是用的,那么ANSI類型的字符和UNICODE類型的字符如何定義,如何使用呢?ANSI和UNICODE又如何轉(zhuǎn)換呢?   
   一.定義部分:  
   ANSI:char    str[1024]; 可用字符串處理函數(shù):strcpy( ),    strcat( ),   strlen( )等等。
UNICODE:wchar_t    str[1024];可用字符串處理函數(shù)   
二.可用函數(shù): 
   ANSI:即char,可用字符串處理函數(shù):strcat(    ),strcpy(    ),    strlen(    )等以str打頭的函數(shù)。   
   UNICODE:即wchar_t 可用字符串處理函數(shù):wcscat(),wcscpy(),wcslen()等以wcs打頭的函數(shù)。   
   三.系統(tǒng)支持  
      Windows    98    :只支持ANSI。   
      Windows    2k    :既支持ANSI又支持UNICODE。   
      Windows    CE    :只支持UNICODE。   
      說明   
      1 在COM里面只支持UNICODE。   
      2.Windows   2000整個OS系統(tǒng)都是基于UNICODE的,為此在windows 2000 下使用ANSI是需要付出代價的,雖然在編碼上不用任何的轉(zhuǎn)換,但是這種轉(zhuǎn)化是隱藏的,是占用系統(tǒng)資源的(CPU,內(nèi)存)。   
      3 在Windows 98下必須使用UNICODE,則需要自己手動的編碼切換。   
    四.如何區(qū)分:   
    在我們軟件開發(fā)中往往需要即支持ANSI又支持UNICODE,不可能在要求類型轉(zhuǎn)換的時候,重新改變字符串的類型,和使用于字符串上的操作函數(shù)。為此, 標(biāo)準(zhǔn)C運行期庫和Windows 提供了宏定義的方式。   
    在C語言里面提供了 _UNICODE宏(有下劃線),在Windows里面提供了UNICODE宏(無下劃線),只要定了_UNICODE宏和UNICODE宏,系統(tǒng)就會自動切換到UNICODE版本,否則,系統(tǒng)按照ANSI的方式進行編譯和運行。   
    只定義了宏并不能實現(xiàn)自動的轉(zhuǎn)換,他還需要一系列的字符定義支持。   
   1. TCHAR   
   如果定義了UNICODE宏則TCHAR被定義為wchar_t。   
    typedef    wchar_t    TCHAR;   
    否則TCHAR被定義為char   
    typedef    char   TCHAR;   
   2.LPTSTR   
如果定義了UNICODE宏則LPTSTR被定義為LPWSTR。(以前一直不知道LPWSTR是什么東東,終于明白了)   
   typedef    LPTSTR   LPWSTR;   
   否則TCHAR被定義為char   
   typedef    LPTSTR   LPSTR;  
補充一下:
UTF-8是可以用于真正的流式傳輸?shù)模琔nicode是一種編碼方案   
    我的理解是UTF-8是Unicode的一種具體實現(xiàn)。類似的實現(xiàn)還有UTF-16等等。


ANSI/Unicode字符和字符串 
TChar.h是String.h的修改,用于創(chuàng)建ANSI/Unicode通用字符串。

Unicode字符串的每個字符都是16位的。

Win9x只支持ANSI;Win2000/XP/2003支持ANSI/Unicode;WinCE只支持Unicode
       附:有部分Unicode函數(shù)也可以在Win9X中使用,但可能會出現(xiàn)意想不到錯誤。

wchar_t是Unicode字符的數(shù)據(jù)類型。

所有的Unicode函數(shù)均以wcs開頭,ANSI函數(shù)均以str開頭;ANSI C規(guī)定C運行期庫支持ANSI和Unicode
                                 ANSI                                                                              Unicode
       char   *strcat(char   *,   const   char   *)                           wchar_t   *wcscat(wchar_t   *,   const   wchar_t   *) 
       char   *strchr(const   char * , int)                                   wchar_t    *wcschr(const   wchar_t   * , int) 
       int   strcmp(const   char   *,    const   char   *)                int    wcscmp(const   wchar_t   *, const   wchar_t *)
       char *strcpy(char   *,   const   char   *)                           wchar_t   *wcscpy(wchar_t    *,   const   wchar_t    *)
       size_t   strlen(const   char   *)                                        wchar_t    wcslen(const   wchar_t   *)

L" wash " : 用于將ANSI字符串轉(zhuǎn)換為Unicode字符串;
        _TEXT(" wash ")根據(jù)是否定義Unicode或_Unicode進行轉(zhuǎn)換。
       附:_Unicode用于C運行庫;Unicode用于Windows頭文件。

ANSI/Unicode通用數(shù)據(jù)類型
                        Both(ANSI/Unicode)                    ANSI                       Unicode
                               LPCTSTR                                 LPCSTR                   LPCWSTR
                               LPTSTR                                    LPSTR                      LPWSTR
                               PCTSTR                                   PCSTR                      PCWSTR
                               PTSTR                                      PSTR                         PWSTR
                               TBYTE(TCHAR)                      CHAR                         WCHAR

在設(shè)計dll時最好提供ANSI和Unicode函數(shù),ANSI函數(shù)只用于分配內(nèi)存,將字符轉(zhuǎn)換為Unicode字符,然后調(diào)用Unicode函數(shù)。

最好使用操作系統(tǒng)函數(shù),少使用或不實用C運行期函數(shù)
        eg:操作系統(tǒng)字符串函數(shù)(shlWApi.h)
                StrCat(), StrChr(), StrCmp(), StrCpy()等
                注意它們區(qū)分大小寫,也區(qū)分ANSI和Unicode版本
        附:ANSI版函數(shù)在原函數(shù)后加大寫字母A
                Unicode函數(shù)在原函數(shù)后加大寫字母W

成為符合ANSI和Unicode的函數(shù)
        ? 將文本串視為字符數(shù)組,而不是c h a r s數(shù)組或字節(jié)數(shù)組。
        ? 將通用數(shù)據(jù)類型(如T C H A R和P T S T R)用于文本字符和字符串。
        ? 將顯式數(shù)據(jù)類型(如B Y T E和P B Y T E)用于字節(jié)、字節(jié)指針和數(shù)據(jù)緩存。
        ? 將T E X T宏用于原義字符和字符串。
        ? 修改字符串運算問題 。
          如:sizeof(szBuffer) -> sizeof(szBuffer) / sizeof(TCHAR)
                  malloc(charNum) -> malloc(charNum * sizeof(TCHAR))   

對Unicode字符操作的函數(shù)還有:(也有ANSI和Unicode版本)
       lstrcat() , lstrcmp() / lstrcmpi()[ 它們在內(nèi)部調(diào)用CompareString() ], lstrcpy(), lstrlen()
       這些是作為宏實現(xiàn)的。

          C運行期函數(shù)                                       windows函數(shù)
                  tolower()                                  PTSTR   CharLower(PTSTR   pszString)
                  toupper()                                 PTSTR   CharUpper(PTSTR   pszString)
                  isalpha()                                  BOOL   IsCharAlpha(TCHAR   ch)
                                                                   BOOL   ISCharAlphaNumeric(TCHAR   ch)
                  islower()                                  BOOL   IsCharLower(TCHAR   ch)
                  isupper()                                 BOOL   IsCharUpper(TCHAR   ch)
                  print()                                       wsprintf()
       轉(zhuǎn)換Buffer:DWORD   CharLowerBuffer(PTSTR   pszString , DWORD cchString)
                              DWORD CharUpperBuffer(PTSTR   pszString , DWORD   cchString)
       也可轉(zhuǎn)換單個字符,如:TCHAR   cLowerCaseChar = CharLower((PTSTR)szString[0])

確定字符是ANSI或Unicode
        BOOL   IsTextUnicode(
                     const   VOID   * pBuffer,   //input   buffer   to be   examined
                     int   cb,                               //size of input   buffer
                     LPINT   lpi                         //options
        )
       附:此函數(shù)在Win9x系統(tǒng)中,沒有實現(xiàn)代碼,始終返回FALSE

Unicode與ANSI之間的轉(zhuǎn)換
        char   szA[40];
        wchar   szW[40];
        // Normal   sprintf : all   string   are   ANSI
        sprintf( szA , " %s " , " ANSI   str ");
        // Convert   Unicode   string   to ANSI
        sprintf(   szA,   " %S " ,   L" Unicode   str ");
        // Normal   swprintf : all string are unicode
        swprinf( szW , "%s" , L" Unicode   str ");
        // Convert   ANSI   String to Unicode
        swprinf( szW, L"%S" , "ANSI str");

        int   MultiByteToWideChar(
              UINT   uCodePage,                   //code page,   0
              DWORD   dwFlags,                   //character-type   options,   0
              PCSTR   pMultiByte,                  //source   string   Addr
              int   cchMultiByte,                       //source   string   byte length
              PWSTR   pWideCharStr,          //Dest string   Addr
              int   cchWideChar                      //Dest   string char   Nums
         )
        u C o d e P a g e參數(shù)用于標(biāo)識一個與多字節(jié)字符串相關(guān)的代碼頁號。d w F l a g s參數(shù)用于設(shè)定另一個控件,它可以用重音符號之類的區(qū)分標(biāo)記來影響字符。這些標(biāo)志通常并不使用,在d w F l a g s參數(shù)中傳遞0。p M u l t i B y t e S t r參數(shù)用于設(shè)定要轉(zhuǎn)換的字符串, c c h M u l t i B y t e參數(shù)用于指明該字符串的長度(按字節(jié)計算)。如果為c c h M u l t i B y t e參數(shù)傳遞- 1,那么該函數(shù)用于確定源字符串的長度。轉(zhuǎn)換后產(chǎn)生的U n i c o d e版本字符串將被寫入內(nèi)存中的緩存,其地址由p Wi d e C h a r S t r參數(shù)指定。必須在c c h Wi d e C h a r參數(shù)中設(shè)定該緩存的最大值(以字符為計量單位)。如果調(diào)用M u l t i B y t e To Wi d e C h a r,給c c h Wi d e C h a r參數(shù)傳遞0,那么該參數(shù)將不執(zhí)行字符串的轉(zhuǎn)換,而是返回為使轉(zhuǎn)換取得成功所需要的緩存的值。

     可以通過下列步驟將多字節(jié)字符串轉(zhuǎn)換成U n i c o d e等價字符串:
     1) 調(diào)用M u l t i B y t e To Wi d e C h a r函數(shù),為p Wi d e C h a r S t r參數(shù)傳遞N U L L,為c c h Wi d e C h a r參數(shù)傳遞0。
     2) 分配足夠的內(nèi)存塊,用于存放轉(zhuǎn)換后的U n i c o d e字符串。該內(nèi)存塊的大小由前面對M u l t B y t e To Wi d e C h a r的調(diào)用返回。
     3) 再次調(diào)用M u l t i B y t e To Wi d e C h a r,這次將緩存的地址作為p Wi d e C h a r S t r參數(shù)來傳遞,并傳遞第一次調(diào)用M u l t i B y t e To Wi d e C h a r時返回的緩存大小,作為c c h Wi d e c h a r參數(shù)。
     4) 使用轉(zhuǎn)換后的字符串。
     5) 釋放U n i c o d e字符串占用的內(nèi)存塊。

    int WideCharToMultiByte(
          UINT CodePage,                        // code page
          DWORD dwFlags,                      // performance and mapping flags
          LPCWSTR lpWideCharStr,      // wide-character string
          int cchWideChar,                       // number of chars in string
          LPSTR lpMultiByteStr,               // buffer for new string
          int cbMultiByte,                           // size of buffer
          LPCSTR lpDefaultChar,            // default for unmappable chars
          LPBOOL lpUsedDefaultChar   // set when default char used
     )

 

本文轉(zhuǎn)自:http://hi.baidu.com/%C6%DF%D4%C2%BA%A3%C0%B6/blog/item/65639b25cc31f16234a80fc4.html

posted @ 2011-09-07 16:21 Daywei 閱讀(851) | 評論 (0)編輯 收藏

C+之父力作學(xué)習(xí)筆記6——派生類

      現(xiàn)在來考慮做一個程序,處理某公司所雇傭人員的問題。這個程序可能包含如下一種數(shù)據(jù)結(jié)構(gòu):
struct Employee
{
    
string first_name,family_name;
    
char middle_initial;
    Date hiring_date;
    
short department;
    
//
}
;
下一步我們可能需要去定義經(jīng)理:
struct Manager
{
    Employee emp;
    list
<Employee*> group; //所管理的人員
    short level;
    
//
}
;
一個經(jīng)理同時也是一個雇員,所以在Manager對象的emp成員存儲著Employee數(shù)據(jù)。很明顯這樣的設(shè)計是糟糕的,大家都會想到派生:
struct Manager:public Employee
{
    list
<Employee*> group;
    
short level;
}
;
這個Manager是由Employee派生的,反過來就是說,Employee是Manager的一個基類。類Manager包含類Employee得所有成員,再加上它自己的一些成員。
      按照這種方式從Employee派生出Manager,就使Manager成為Employee的一個子類型,使Manager可以用在能夠接受Employee的任何地方。因為Manager是Employee,所以Manager*就可以當(dāng)做Employee*使用。然而,因為Employee不一定是Manager,所以Employee*就不能當(dāng)做Manager*用。總而言之類Derived有一個公用基類Base,那么就可以用Derived*給Base*類型的變量賦值,不需要顯示的類型轉(zhuǎn)換。而相反的方向,從Base*到Derived*則必須顯示轉(zhuǎn)換。例如:
void g(Manager mm,Employee ee)
{
    Employee
* pe = &mm;  //可以:Manager都是Employee
    Manager* pm = &ee;   //錯誤:Employee不一定是Manager
    pm->level = 2;       //災(zāi)難:ee沒有l(wèi)evel
    pm = static_cast<Manager*>(pe);//蠻力:這個可以,因為pe指向的是Manager mm
    pm->level = 2;       //沒問題
}

      派生類的成員可以使用其基類的公用的和保護的成員,但是,派生類不能使用基類的私有成員。對于派生類的成年公園而言,保護成員就像是公用成員;但對于其他函數(shù)它們則像是私用成員。
      下面說說派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)
      有些派生類需要構(gòu)造函數(shù)。如果某個基類中有構(gòu)造函數(shù),那么就必須調(diào)用這些構(gòu)造函數(shù)中的某一個。默認構(gòu)造函數(shù)可以被隱含的調(diào)用,但是,如果一個基類的所有構(gòu)造函數(shù)都有參數(shù),那么就必須顯示的調(diào)用其中的某一個。基類構(gòu)造函數(shù)的參數(shù)應(yīng)在派生類構(gòu)造函數(shù)的定義中有明確描述。在這方面,基類的行為恰恰就像是派生類的一個成員。例如:
Employee::Employee(const string& n,int d):family(n),department(d)
{
    
//
}


Manager::Manager(
const string& n,int d,int lvl):Employee(n,d),/*初始化基類*/level(lvl)/*初始化成員*/
{
    
//
}
派生類的構(gòu)造函數(shù)只能描述它自己的成員和自己的直接基類的初始式,它不能直接去初始化基類的成員,例如:
Manager::Manager(const string& n,int d,int lvl):family_name(n).department(d),level(lvl)//錯誤:在Manager里沒有family_name和department的聲明
{
//
}
 類對象的構(gòu)造是自下而上進行的:首先是基類,而后是成員,再后才是派生類本身。類對象的銷毀則正好以相反的順序進行:首先是派生類本身,而后是成員,再后才是基類。
      對于給定的一個類型為Base*的指針,被指的對象到底屬于哪個派生類型呢?這個問題有四種基本的解決方案:
  1.  保證被指的只能是唯一類型的對象
  2. 在基類里安排一個類型域,供函數(shù)檢查
  3.  使用dynamic_cast
  4.  使用虛函數(shù)  

       從Employee的函數(shù)中取得“正確的”行為i,而又不依賴于實際使用的到底是哪一種Employee,這就是所謂的多態(tài)性。一個帶有虛函數(shù)的類型被稱為是一個多態(tài)類型。要在C++里取得多態(tài)行為,被調(diào)用的函數(shù)就必須是虛函數(shù),而對象則必須是通過指針或者引用去操作的。如果直接操作一個對象(而不是通過指針或引用),它的確切類型就已經(jīng)為編譯器所知,因此也就不需要運行時的多態(tài)性了。
      那么一個虛函數(shù)聲明為純虛函數(shù),則這個虛函數(shù)所在的類為抽象類。用=0作為初始式就使虛函數(shù)成為“純虛的”。注意:不能創(chuàng)建抽象類的對象。抽象類只能做界面,作為其他類的基類。還有一點也要指的注意,一個未在派生類里定義的純虛函數(shù)仍舊還是一個純虛函數(shù),這種情況也將使該派生類仍為一個抽象類。例如:

class Shape
{
     
public:
        
virtual void draw()=0;
        
virtual bool isClose()=0;
     
//
}
;

class Circel:public Shape
{
    
public:
       
bool isClose(){return true;}//覆蓋Shap::isClose
       
//draw尚未覆蓋
}
;

Circel a;//錯誤:聲明的是抽象類Circel對象

抽象類的最重要用途就使提供一個界面,而又不是暴露任何實現(xiàn)的細節(jié)。
      
     忠告 :

  • 避免類型域
  • 用抽象類將設(shè)計的中心集中到提供清晰的界面方面
  • 用抽象類使界面最小化
  • 一個有虛函數(shù)的類應(yīng)該有一個虛析構(gòu)函數(shù)
  • 抽象類通常不需要構(gòu)造函數(shù)

posted @ 2011-08-28 17:20 Daywei 閱讀(2006) | 評論 (0)編輯 收藏

C++之父力作學(xué)習(xí)筆記5——運算符重載

      在C++包含很多運算符,但以下幾個運算符不能由用戶定義:
      ::(作用域解析;)
      ,(成員選擇)
      .* (通過到成員的指針做成員選擇)
      ?:三元條件運算符
      sizeof和typeid

      運算符函數(shù)的名字是由關(guān)鍵字operator后跟對應(yīng)的運算符構(gòu)成的;例如operator<<。運算符函數(shù)的定義和使用都可以像其他函數(shù)一樣。使用運算符不過是顯示調(diào)用運算符函數(shù)的一種簡寫形式。例如
void f(complex a,complex b)
{
    complex c
=a+b;  //簡寫
    complex d=a.operator+(b);//顯示調(diào)用
}


      一個運算符函數(shù)必須或者是一個成員函數(shù),或者至少有一個用戶定義類型的參數(shù)(重新定義運算符new和delete的函數(shù)則沒有此項要求)。這一規(guī)則就保證了用戶不能改變原有表達式的意義,除非表達式中包含有用戶定義類型的對象。特別的,不能定義只對指針進行操作的運算符函數(shù)。

      忠告:
      1.定義運算符主要是為了模仿習(xí)慣使用方式
      2.對于大型運算對象,請使用const引用參數(shù)類型
      3.對于需要訪問表示的操作,優(yōu)先考慮作為成員函數(shù)而不是作為非成員函數(shù)
      4.對于對稱的運算符采用非成員函數(shù)
      5.將只有一個“大小參數(shù)”的構(gòu)造函數(shù)做成explicit

      運算符重載的內(nèi)容應(yīng)該還是挺多的,但卻不知道如何寫,看來還是文筆太差了,有機會再補上吧。
      

posted @ 2011-08-20 13:41 Daywei 閱讀(1489) | 評論 (0)編輯 收藏

C++之父力作學(xué)習(xí)筆記(4)——類的好多事

      類,這個概念比較大。包含的事太多。咱們就一一的盡量弄清楚它。
      一個類就是一個用戶定義類型。C++里類概念的目標(biāo)就是為程序員提供一種建立新類型的工具,是這些新類型的使用能夠像內(nèi)部一樣方便。
      訪問控制:class成員的默認訪問方式是私有的。一個struct也是一個class,但是其成員的默認方式是公用的。非成員函數(shù)禁止訪問私有成員。
      構(gòu)造函數(shù):就是函數(shù)名和類名一樣的函數(shù)且沒有返回值。這誰都知道。It's easy。而默認構(gòu)造函數(shù)就是調(diào)用時不必提供參數(shù)的構(gòu)造函數(shù)。如果用戶自己聲明了一個默認構(gòu)造函數(shù),那么就會去使用它;否則,如果有必要,而且用戶沒有聲明其他的構(gòu)造函數(shù),編譯器就會設(shè)法去生成一個。編譯器生成的默認構(gòu)造函數(shù)將隱式地為類類型的成員和它的基類調(diào)用有關(guān)的默認構(gòu)造函數(shù)。這里解釋一下:類類型(Class type)即指那些由程序員定義的類而產(chǎn)生的類型,以便與內(nèi)部類型和其他用戶定義類型相區(qū)分。相信大家這里也沒什么問題。有一個注意點來了,由于const和引用必須進行初始化,包含const或引用成員的類就不能進行默認構(gòu)造,除非程序員的我們自己顯示的提供默認構(gòu)造函數(shù)。例如:
struct X
{
    
const int a;
    
const int& r;
}
;
X x;
//錯誤;X無默認構(gòu)造函數(shù)
      默認構(gòu)造函數(shù)也可以顯示調(diào)用。內(nèi)部類型同樣也有默認構(gòu)造函數(shù)。
      下面再談?wù)剰?fù)制構(gòu)造函數(shù),先看看復(fù)制構(gòu)造函數(shù)是怎么引進來的。
按照默認約定,類對象可以復(fù)制。特別是可以用一個類的對象和復(fù)制對該類的其他對象進行初始化。即使是聲明了構(gòu)造函數(shù)的地方,也是可以這樣做:
Date d=today;//通過復(fù)制初始化
按照默認方式,類對象的復(fù)制就是其中各個成員的復(fù)制。如果某個類X所需要的不是這種默認方式,那么就可以定義一個復(fù)制構(gòu)造函數(shù)X::X(const X&),由它提供所需要的行為。還有一個概念就是復(fù)制賦值,很容易和復(fù)制構(gòu)造函數(shù)搞混。咱們就一起搞清楚它們。先看一段程序:
void h()
{
    Table t1;
    Table t2
=t1;//復(fù)制初始化
    Table t3;
    t3
=t2;      //復(fù)制賦值
}
看似好像沒什么問題,對于復(fù)制上面提到的解釋方式,在應(yīng)用到具有指針成員的類的對象時,就可能產(chǎn)生一種出人意料的作用。對于包含了由構(gòu)造函數(shù)/析構(gòu)函數(shù)管理的資源的對象而言,按成員復(fù)制的語義通常是不正確的。在這里,Table的默認構(gòu)造函數(shù)為t1和t3各調(diào)用了一次,一共是兩次。然而Table的析構(gòu)函數(shù)則被調(diào)用了三次;對t1、t2和t3各一次!由于賦值的默認解釋是按成員賦值,所以在h()結(jié)束時,t1、t2和t3中將各包含一個指針,它們都指向建立t1時從自由存儲中分配的那個名字?jǐn)?shù)組。在建立t3時所分配的數(shù)組的指針并沒有保留下來,因為它被賦值t3=t2覆蓋掉了。這樣,如果沒有自動廢料收集,對這個程序而言,該數(shù)組的存儲就將永遠丟掉了。而在另一方面,為t1的創(chuàng)建而分配的數(shù)組因為同時出現(xiàn)在t1、t2和t3里,將被刪除3次。這種情況所導(dǎo)致的結(jié)果是無定義,很可能是災(zāi)難性的。這類反常情況可以避免,方式就是將Table復(fù)制的意義定義清楚:
class Table
{
    
//---
    Table(const Table&);//復(fù)制構(gòu)造函數(shù)
    Table& operator=(const Table&);//復(fù)制賦值
}
;
咱們自己可以為這些復(fù)制操作定義自己認為最合適的任何意義,例如
//這里補上Table類的詳細定義
class Table
{
    Name
* p;
    size_t sz;
public:
    Table(size_t s
=15)
    
{
        p
=new Name[sz=s];
    }

    
~Table()
    

        delete[] p;
    }

    Name
* loopup(const char*);
    
bool insert(Name*);
}


Table::Table(
const Table& t)//復(fù)制構(gòu)造函數(shù)
{
   p
=new Name[z=t.sz];
   
for(int i=0;i<sz;i++)
      p[i]
=t.p[i];
}


Table
& Table::operator=(const Table& t)//賦值
{
    
if(this!=&t)//當(dāng)心自賦值:t=t
    
{
        delete[] p;
        p
=new Name[sz=t.sz];
        
for(int i=0;i<sz;i++)
            p[i]
=t.p[i];
    }

    
return *this;
}
情況幾乎總是如此,復(fù)制構(gòu)造函數(shù)與復(fù)制賦值通常都很不一樣。究其根本原因,復(fù)制構(gòu)造函數(shù)是去完成對為初始化的存儲區(qū)的初始化,而復(fù)制賦值運算符則必須正確處理一個結(jié)構(gòu)良好的對象。
      成員常量:
      對那些靜態(tài)整型成員,可以給它的成員聲明加上一個常量表達式作為初始式,例如
class Curious
{
    
static const int c1=7;//ok,但要記得去定義
    static int c2=11;//錯誤:非const
    const int c3;//錯誤:非Static
    static const int c4=f(1);//錯誤:在類里的初始表達式不是常量
    static const float c5=7.0;//錯誤:在類里初始化的不是整型
}
1)在類中不能用const來創(chuàng)建常量!因為:類只是描述了對象的形式,并沒有真正創(chuàng)建對象!所以, 在對象建立之前,并沒有存值空間!
2)而const是用來創(chuàng)建常量的!
方法1 你可以用枚舉:
class a
{
enum{buf_size_t buf_size=、、、}//用枚舉創(chuàng)建一個常量,但不是數(shù)據(jù)成員

}

方法2 你可以用static
class a
{
private
  
static const buf_size_t buf_size=30//該常量將與憋得靜態(tài)常量存儲在一起,而不是存儲在對象中
}
但《C++程序設(shè)計語言》書上說當(dāng)你用到某個被初始化的成員,而且需要將它作為對象存入存儲器時,這個成員就必須在某處有定義。初始式不必重復(fù)寫:
const int Curious::c1;//必須,但這里不必重復(fù)初始式
const int* p=&Cusious::c1;//ok:Curious::c1已經(jīng)有定義
這里有點讓我懵了,為什么還要const int Curious::c1;//必須,但這里不必重復(fù)初始式 這一行呢?還說是必須,經(jīng)過測試是有問題的——當(dāng)前范圍內(nèi)的定義或重新聲明非法,到底是書錯了還是還有其他什么原因?
還請高手不吝賜教
今天就到這里吧,到這里就出了問題,還需要思考。

這里有一篇博文關(guān)于
VC6.0中,整型const static成員不能在類的定義體中初始化. http://blog.csdn.net/yiruirui0507/article/details/5984530




posted @ 2011-08-05 17:00 Daywei 閱讀(2228) | 評論 (0)編輯 收藏

C++之父力作學(xué)習(xí)筆記3——指針

   由于工作需要轉(zhuǎn)成了C#,好久沒有學(xué)C++了,之前學(xué)了一段時間的C++,也寫過兩篇,放在博客園里的,現(xiàn)在有專門的C++博客,以后就在這里寫了。以下是前兩篇的地址
C++之父力作學(xué)習(xí)筆記1    C++之父力作學(xué)習(xí)筆記
    
   今天來簡單說一下指針,可以說指針是一個難點,是一把雙刃劍,也許高手才能運用自如,像我這樣的菜鳥就會傷到自己。呵呵,廢話少說。
   指針:對類型T,T*是“到T的指針”,也就是說,一個類型為T*的變量能保存一個類型T的對象的地址。例如:
char c='a';
char *p=&c;//p保存著c的地址

用圖表示是:

這些都挺容易理解的,不幸的是,到數(shù)組的指針和到函數(shù)的指針需要更復(fù)雜的記法:
int* pi;          //到int的指針
char** ppc;       //到字符的指針的指針
int* ap[10];      //10個到int的指針的數(shù)組
int (*fp)(char*); //到函數(shù)的指針,這種函數(shù)以char*為參數(shù),返回int
int* f(char*);    //有一個char*參數(shù)的函數(shù),返回一個到ini的指針

   對指針的基本操作是間接引用,也就是說引用被指針?biāo)傅哪莻€對象。這一操作也被稱作間接(indirectionn)。間接運算符是(前綴的)一元*。例如
char c='a';
char* p=&c;   //p保存著c的地址
char c2=*p;   //c2=='a'
被p所指的變量是c,而c中所存的值是'a'。所以由*p賦給c2的值就是'a'.
注意:這里解釋一下 間接運算符是(前綴的)一元*。這就要扯到聲明的結(jié)構(gòu)了。
         一個聲明由四個部分組成:一個可選的“描述符”,一個基礎(chǔ)類型,一個聲明符,還有一個可選的初始式。除了函數(shù)和名字空間之外,其他聲明都應(yīng)該由分號結(jié)束。例如:
char* kings[]={"Antigonus","Seleucus","Ptolemy"};
這里的基礎(chǔ)類型是char,聲明符是*kings[],而初始化是={...}。
      描述符是一個開始關(guān)鍵字,例如:virtual和extern,它們說明了被聲明事物的某些非類型的屬性。
      聲明符由一個名字和可選的若干聲明運算符組成。最常用的聲明運算符是
      *             指針          前綴
      *const     常量指針     前綴
      &            引用           前綴
      []            數(shù)組          后綴
      ()            函數(shù)          后綴




posted @ 2011-07-26 11:13 Daywei 閱讀(2561) | 評論 (0)編輯 收藏

僅列出標(biāo)題
共4頁: 1 2 3 4 
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿

隨筆分類

隨筆檔案

文章檔案

牛人博客

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美暴力喷水在线| 91久久黄色| 久久精品国产欧美激情| 亚洲一区二区免费在线| 欧美日韩一区二区视频在线观看 | 国产三级精品三级| 久久蜜桃香蕉精品一区二区三区| 久久精品毛片| 亚洲国产欧美在线人成| 日韩一级在线| 国产农村妇女毛片精品久久麻豆 | 久久gogo国模裸体人体| 久久精品一二三| 欧美性片在线观看| 欧美亚洲一区二区在线| 亚洲理论在线观看| 欧美精品偷拍| 欧美在线观看一区二区| 久久久久久久尹人综合网亚洲| 久久精品视频va| 欧美性开放视频| 久久久久久精| 欧美区一区二| 欧美在线播放视频| 久久综合网hezyo| 亚洲影院在线| 久久久亚洲一区| 亚洲欧美日韩视频二区| 浪潮色综合久久天堂| 亚洲小视频在线观看| 性欧美xxxx大乳国产app| 欧美激情欧美狂野欧美精品| 欧美在线一二三| 国产欧美日韩91| 欧美激情一区二区久久久| 欧美黄在线观看| 国产精品av免费在线观看| 久久久综合视频| 国产精品二区在线| 亚洲电影免费在线 | 久久久久久久999精品视频| 久久久久久久999精品视频| 亚洲一区二区黄色| 欧美二区乱c少妇| 久久免费视频一区| 国产精品成人av性教育| 亚洲国产专区| 久久精品伊人| 国产一区二区剧情av在线| 老司机精品福利视频| 欧美午夜精品久久久久久浪潮 | 性欧美在线看片a免费观看| 免费不卡在线观看| 久久中文字幕导航| 国产日本欧美一区二区三区在线| 夜夜嗨av一区二区三区中文字幕 | 久久久综合网站| 久久久久国产精品一区三寸| 国产精品日本| 国产精品99久久99久久久二8 | 久久亚洲影院| 久久天天躁狠狠躁夜夜av| 国产欧美在线播放| 午夜久久影院| 久久成人精品无人区| 国产精品资源| 亚洲欧美日韩一区| 亚洲手机视频| 亚洲电影天堂av| 影音欧美亚洲| 久久中文在线| 欧美激情按摩在线| 亚洲人午夜精品免费| 欧美福利影院| 亚洲毛片在线观看| 亚洲一区综合| 国产伦精品一区二区三区免费迷| 亚洲一区网站| 久久黄色影院| 在线播放中文字幕一区| 美女精品国产| 日韩视频免费观看| 午夜精品一区二区三区电影天堂| 国产精品久久久久av免费| 香蕉久久夜色| 欧美电影在线观看完整版| 99热这里只有精品8| 欧美午夜精品久久久久久浪潮| 亚洲女优在线| 欧美jizzhd精品欧美巨大免费| 亚洲清纯自拍| 欧美深夜福利| 久久国产毛片| 亚洲精品三级| 久久精品国产99| 亚洲人成小说网站色在线| 欧美性猛片xxxx免费看久爱| 久久久久国产精品一区二区| 亚洲欧洲日产国产综合网| 欧美一区二区女人| 亚洲人成网站在线观看播放| 国产精品美女主播| 久久一本综合频道| 宅男噜噜噜66国产日韩在线观看| 久久久久久久久久久久久久一区 | 国产情侣一区| 欧美精品国产精品日韩精品| 午夜精品久久久久久久久 | 欧美成人资源网| 亚洲欧美日韩一区| 亚洲精品国偷自产在线99热| 国产乱子伦一区二区三区国色天香 | 亚洲欧美日韩电影| 亚洲国产一二三| 国产亚洲精品美女| 欧美日韩亚洲高清一区二区| 久久久精品一区二区三区| 亚洲图片欧洲图片av| 亚洲第一伊人| 久久久噜噜噜久久中文字幕色伊伊| 一区二区三区|亚洲午夜| 一区二区亚洲精品国产| 国产精品亚洲аv天堂网| 欧美日韩a区| 欧美成熟视频| 久久婷婷人人澡人人喊人人爽 | 欧美成人日本| 久久国产毛片| 午夜精品99久久免费| 在线亚洲自拍| 99国内精品| 亚洲精品专区| 亚洲精品乱码久久久久| 在线免费观看成人网| 黄色国产精品| 亚洲日本理论电影| 久久综合狠狠| 亚洲午夜久久久久久久久电影院| 91久久久一线二线三线品牌| 欧美福利视频| 亚洲福利视频一区| 欧美粗暴jizz性欧美20| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久经典综合| 久久久久成人精品| 久热精品在线视频| 老妇喷水一区二区三区| 能在线观看的日韩av| 欧美69视频| 亚洲第一黄色| 亚洲人成绝费网站色www| 亚洲欧洲一区二区三区| 亚洲人成在线免费观看| 日韩午夜在线播放| 在线亚洲免费视频| 亚洲欧美国产另类| 久久精品国产v日韩v亚洲| 久久美女性网| 欧美激情国产日韩精品一区18| 欧美日韩成人| 国产精品日韩精品| 国产亚洲毛片在线| 亚洲国产精品福利| 99国产精品久久久久久久久久 | 亚洲欧洲一区二区三区久久| 日韩午夜激情av| 亚洲欧美综合另类中字| 久久精彩免费视频| 欧美成人第一页| 欧美图区在线视频| 国产一区二区三区久久悠悠色av | 国产精品亚洲综合一区在线观看| 国产视频欧美| 亚洲精品一品区二品区三品区| 亚洲午夜女主播在线直播| 久久电影一区| 亚洲国产精品国自产拍av秋霞| 亚洲午夜在线| 久久综合一区二区| 国产精品电影在线观看| 影音先锋亚洲精品| 亚洲无人区一区| 免费在线播放第一区高清av| 99热免费精品| 久久综合九色欧美综合狠狠| 欧美三级网址| 亚洲国产精品久久| 亚洲欧美一区二区原创| 欧美激情自拍| 欧美伊久线香蕉线新在线| 欧美日韩国产首页在线观看| 国产在线高清精品| 亚洲一区二区视频在线| 欧美成人69av| 欧美亚洲网站| 国产精品三区www17con| 日韩视频久久| 欧美黄色一级视频| 欧美亚洲专区| 国产精品日韩在线|