由于个人基础不扎实,看一段比较长的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 关于字符数组的赋值