C++小筆記(持續更新中...)

         由於個人基礎不紮實,看一段比較長的C++代碼有時候很費勁,主要是一些定義和結構不熟悉。做些小記,方便參考。

 

1. 析構函數

      與類同名,在構造函數前加 “~”,例如:

class play

  {  public:

              play();            //構造函數

            ~play();           //析構函數

     ......

    }

析構函數不帶任何參數,沒有返回值(包括void類型),每個類中有且只能有一個析構函數。析構函數不能被重載,如果用戶沒有寫析構函數,系統會自動生成。析構函數的作用:”清理善後“,釋放空間。

 

2. 虛函數和純虛函數

    虛函數:實現動態聯編,也就是在程序運行階段動態地選擇合適的成員函數,在定義了虛函數後,可以再基類的派生中對虛函數重新定義,但參數必須和定義的一樣(即接口一樣)。

   virtual  void play(int a,int b)

 { 

   派生類中自定義函數

 }

 

純虛函數:

  vritual play{}=0;

二者的聯繫與區別:虛函數和純虛函數可以定義在同一類中,含有純虛函數的類被稱爲抽象類,虛函數可以直接被調用,也可以被子類重載以後以多臺的定時調用。而純虛函數必須在子類中實現該函數纔可以使用。因爲純虛函數在積累中只有聲明沒有定義。此外,純虛函數不能爲static類型,聲明中不能實例化。

 

3.assert()函數

   如果()裏的條件判斷爲FALSE或0,程序報錯,並終止運行。否則繼續。通常用來判斷是否有非法數據結構。


4.關於main函數裏的argc和argv參數

C/C++中的MAIN函數經常帶有參數argc和argv,例如:

     int main(int argc, char** argv){......}

或  int main ( int argc, char* argv[]){.....}

參數作用:

       argc是指命令行輸入參數的個數(以 空白 爲分隔符)。

       argv 存儲了所以命令行參數。例如,程序是 hello.exe 你在命令行運行該程序,(首先在命令行下用cd命令進入Hello.exe文件所在目錄),命令:

       hello.exe Crossi

那麼,argc值爲2,argv[0]="hello.exe" ,  argv[1]="Crossi" 


5. 在程序裏調用了外部的頭文件或者依賴庫,運行的時候出現了一大堆如下的類似錯誤:

  “......error C2210:缺少xx,(在標示符xx的前面)”

  “......error C4430缺少類型 說明符xx, 假定爲int。注意:C++不支持默認int"

  "......error C2086”int xxx":重定義“

錯因:添加的外圍文件是C類型,現在的編程環境是C++標準。相應的函數缺少類型,比如說main(), 定義成int或者void的之類的。

解決辦法如下:

         1.在main()等函數添加類型:int,char ,void等等

         2.添加包含庫:#include<Windows.h>、#include<string>

         3.注意頭文件包含順序:系統和環境文件先添加,再來是外圍文件。比如Windows.h放前面。


6.各種數據類型及其長度(32位操作系統)

   參考 http://blog.sina.com.cn/s/blog_729bdd570100u5lf.html


基本數據:位bit    字節byte(8個bit) 字Word(16位) 雙字dword(32位)  四字qword(64bit)


位(bit)只能是0,1代碼,因爲四個二進制數是一個16進制數,所以,兩個16進制的基數表示一個字節。

(1)

(帶有”/”的類型可以在VC中互用)
長度爲一個字節(8位)的數據類型)
bool

CHAR/char

BYTE/byte

BOOLEAN/boolean

TCHAR


長度爲兩個字節(16位)的數據類型
short/SHORT

WORD


長度爲四個字節(32位)的數據類型
CString

int/INT(有符號整型)

long/LONG(有符號整型)

float/FLOAT

DWORD

BOOL
LPCTSTR

LPTSTR


長度爲八個字節(64位)的數據類型
double/DOUBLE


(2)預定義數據類型

BOOL:    typedef int BOOL;


BOOLEAN:   typedef BYTE BOOLEAN;


WORD:.   typedef unsigned short WORD;


DWORD:     typedef unsigned long DWORD;


UINT:Unsigned INT.     typedef unsigned int UINT;

HRESULT
用於接口,成功的話返回0,否則是非0數。typedef LONG HRESULT;


LPCVOID:一種指向任意類型的指針   typedef CONST void *LPCVOID;


LPCWSTR:指向16位Unicode空終止字符串的指針
typedef CONST WCHAR *LPCWSTR;


LPVOID:   指向任意類型的指針   typedef void *LPVOID;


PVOID:   指向任意類型的指針    typedef void *PVOID;


TCHAR
#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif


VOID:  #define VOID void


WCHAR爲Unicode字符,即不論中英文,每個字有兩個字節組成。
如果當前編譯方式爲ANSI(默認)方式,TCHAR等價於CHAR,如果爲Unicode方式,
TCHAR等價於WCHAR。


LPCSTR = const LPSTR  一個是char*,一個是const char*
LPSTR:32-bit指針,指向一個字符串
LPCSTR:32-bit指針,指向一個常數字符串


LPCTSTR:32-bit指針,指向一個常數字符串。此字符串可移植到Unicode和DBCS(雙字節字集)
LPTSTR:32-bit指針,指向一個字符串。此字符串可移植到Unicode和DBCS(雙字節字集)


LPSTR:    typedef CHAR *LPSTR;


LPCSTR:   typedef __nullterminated CONST CHAR *LPCSTR;


LPTSTR
#ifdef UNICODE
typedef LPWSTR LPTSTR;
#else
typedef LPSTR LPTSTR;
#endif


LPCTSTR
#ifdef UNICODE
typedef LPCWSTR LPCTSTR;
#else
typedef LPCSTR LPCTSTR;
#endif


LPCSTR可以理解成一種命名方法(即匈牙利命名法)
LPCSTR表示爲:
L 也許是long
P 也許是point(即*)
C 也許是const
STR也許是說明它是一個字符串。
也即32-指針指向一個字符串常量。


7  關於字符數組的賦值

   你知道嗎,在C++中允許使用以空字符結束的字符數組來初始化string對象或者爲string對象賦值。允許上述的字符作爲string對象的加法右側運算對象。
但是,反過來就不行!如果程序的某處需要一個C風格字符串,不能用string對象來給字符數組賦值!!!用c_str()成員函數來代替次功能:
   char *str = s ;   //錯誤,不能用string對象來初始化char*
   const char *str = s.c_str();  //正確


8 關於vector<> 、數組以及迭代器
  vector<>和數組都是容器,所有容器都支持迭代器;
  vector<>沒有固定的長度,數組有固定長度;
  迭代器類似於指針,常用的是成員頭迭代器begin()和尾迭代器end();
  迭代器能加減運算,比較運算等,但是指針加減比較沒意義:v.end()-v.begin()爲容器長度;
  
  



 

 

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章