1.while(0)二种用法,一种是用于跳转,一种是用于宏
2.声明变量中的外部变量是用extern,声明寄存器变量是register.
3.static全局变量,static局部变量,区别在于:虽然都是存放在全局存储区,但全局static作用域为整个文件,局部static变量作用域为声明区域。当定义它的函数或语句块结束时,其作用域随之结束。再次进入后又会恢复其值。
static函数则又称内部函数,即只能被当前文件使用,其他文件不能调用。
4.private 静态成员数据与public静态成员数据区别在于private只能由类的成员方法来赋值,不能在其他地方进行赋值,包括子类。
5.定义直接写在类里面的是内联函数,写在外面的是外联函数。
6.类数据成员指针和类方法指针:定义指向该类的(public)数据成员和方法的指针。假如类myclass有数据成员public:int c和成员方法int cc();在main就可以定义 int myclass::*pc,pc=&myclass::c,my.*pc=2;int (myclass::*pcc)(),pcc=&myclass:cc;
7.指针数组和数组指针。int (*a)[4],指向数组的指针。int *p[4],数组元素为指针的数组。
8.常量指针和指针常量。
char * const pl=string1;
p1=string2;
*p1="this a string";//合法,因为指针p1所指向的内容是可以更新的。
const char* p2=string1;
p2=string2;//指针可以更改。
*p2="this is a string";//非法,p2所指向的字符串是不能更新的。const 在*前面就是常量指针(内容是常量),在*后面就是指针常量了。
9.定义常成员函数。void disp() const{} ,如果不是内联函数,则在外部也得在尾部加上const.
const int i;常数据成员,则要通过构造函数的初始化列表来进行初始化:Myclass():x(i);
10.字符串前面加"L","_T","_TEXT",L是将ANSI转换成unicode,_T是根据环境设置(unicode/ansi)来决定转换的结果。_TEXT和_T一样。只是__TEXT和TEXT是windows宏,:__T、_T和_TEXT是VC宏。unicode与多字节是二回事,多字节多指w开头的。
11.派生类的继承方式决定着基类成员对派生类的可见性和基类成员对派生类对象的可见性。class a:public b:派生类的对象可以访问基类中的公有成员;派生类及派生类的子类的成员函数可以访问基类的公有成员和保护成员。class a:private b:派生类可以访问基类的公有成员和保护成员,不能被派生类的子类访问。基类的所有成员对派生类对象都是不可见的。class a:protected b:与private相同,区别只是基类的公共成员和保护成员都作为派生类的保护成员,并且不能被派生类的子类访问。
12.函数参数分为传值,传址,引用。传址为a(int *b);a(&i)。引用为a(int &b);a(i);
13.操作系统获取消息并传入消息队列,在程序里面Getmeessage取得消息,DispatchMessage会先调用windows,进入管态(大概是range 0),然后再由windows调用窗口的函数。为什么这么麻烦?因为这样windows就可以知道你的程序运行到什么情况了, windows来调用你的窗口,这样你的窗口返回的时候windows就知道你已经处理过一个消息了,如果没有新的消息进入消息队列, windows就不再会给你的进程分配时间片。
14.建立的窗口与窗口类就是通过类名称。WNDCLASSEX.lpszClassName="a"与CreateWindow("a")。
15.消息能够被分为「队列化的」和「非队列化的」。队列化的消息是由Windows放入程序消息队列中的。在程序的消息循环中,重新传回并分配给窗口消息处理程序。非队列化的消息在Windows呼叫窗口时直接送给窗口消息处理程序。也就是说,队列化的消息被「发送」给消息队列,而非队列化的消息则「发送」给窗口消息处理程序。任何情况下,窗口消息处理程序都将获得窗口所有的消息——包括队列化的和非队列化的。
16.GetAsyncKeyState与GetKeyState区别。GetKeyState只能在消息处理过程中来取得按键的状态,要在之外取得状态就得用GetAsyncKeyState.
17.char *p = "world"; // 注意p指向常量字符串 p[0] ='X'; //出错,因为不能改变常量值。这里只能使用数组而不是指针:char p[]="world";
18:求函数字符数组参数的大小:void func1(TCHAR abc[] ){ TCHAR strNum[3];wsprintf(strNum,_T("%i"),wcslen(abc));MessageBox(NULL, strNum , abc, MB_YESNO);}
19.函数的缺省参数值必须放在声明处,而内联函数inline则必须放在函数定义处。
20.const类成员的初始化要放在初始化列表里面进行。
21. int GetCount(void) const;//const成员函数,不能修改数据成员的函数定义。const只用于放到函数尾部。
22. 所有字符串函数都尽量用_t开头的,(_tcslen等),会自动根据_unicode开头来选择使用宽字符还是ansi字符。而包含CCH的则不会报错,而是截断字符串,如StringCchCat,StringCchCopy,StringCchPrintf,StringCchPrintfEx等。
23.全局变量会初始化,而局域变量则是未初始化状态,是一个随机值。
24.指针引用。 int i=111;int *pi=&i;int *&pti=pi; pti是一个指向指针的引用。引用必须初始化,并且引用是不能重复定义的。
25.const类成员要修改非const成员变量,则要将该成员变量声明为mutable.
26.int i=20;这是初始化。int i;i=20;这是赋值。
27.explicit关键字,C++中, 一个参数的构造函数, 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。
28.关于在子类的初始化列表中调用父类的构造函数,比方说你想记录股市交易日志。
class Transaction{public:Transaction(); virsual void logTransaction() const=0//根据是买还是卖做一份日志};
Transcation::Transaction(){logTransaction();}
class BuyTransacton:public Transcation{virtual void logTransaction()const};
class SellTransaction:public Transcation{virtual void logTransaction()const};
现在,当我用BuyTransaction bs;时由于父类构造函数是最先调用的,父类构造函数里面调用的logTransactoin()就不会是子类版本,在base class构造期间,virtual是不会降到derived class阶层的。这时的解决方法就是不使用virtual,而子类的构造函数将把参数传给父类的构造函数:
class Transaction{public:explicit Transaction(string &loginfo);void logTransaction(string &loginfo)const;};
Transaction:Transaction(string &loginfo){logTransaction(loginfo);}
class BuyTransaction:public Transaction{public Buytransaction():Transaction(para)};
29.如果类中有虚函数,请将析构函数也设为虚函数,保证父类与子类能正确调用析构。当基类设为虚函数后,该类的子类及子子类都是虚函数。
30.除了内置类型外,别的类型尽量用引用传递参数,而不是值传递,特别是将子类传递给一个父类为参数的函数时,将被切除特化信息(好象是指多态功能丢失)。
31.当子父有着与父类同名的函数,那父类函数就被隐藏了(即使有不同参数),如想不隐藏,则要在子父里面using 父类。public: using Base::mf1;using Base::mf3;
32.虚函数尽量声明为私有或保护型。子类可以继承私有虚函数的。私有继承的虚函数, 其访问权限可由派生类指定。
33.if(i=0) 为假,if(i=1)为真
34.uchar *c;c+=2;指针向右移动二位,c[1];//这里取的内容为第三位置的内容。