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()为容器长度;
  
  



 

 

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值