由於個人基礎不紮實,看一段比較長的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 關於字符數組的賦值