参考:http://www.cnblogs.com/steven_oyj/archive/2010/06/02/1749658.html
注释必须和代码一起维护,不应该描述显而易见的事,或把别的地方已说清楚的东西在说一遍。
字面常量没有语义,也没有真正的内存地址。
所以不可以取其地址,也不可以用于初始化普通引用,例如:long &r1 = 40000;
但是const long &r1 = 40000 却是合法的。
所以,尽量不要使用字面常量,而应该使用枚举常量和初始化过的常变量
全局变量增加了模块间的耦合。
当全局变量(静态变量)用来初始化的值不能在编译时就计算妥当,则该初始化动作就会拖到运行期,这容易导致致命错误。可以使用单价模式解决这个问题
函数重载主要用于一组抽象意义相同,但实现不同的函数。
而形式参数默认值主要出于简化,为函数提供更简洁的接口。
(1)由于引用没有地址,声明引用的引用、指向引用的指针或引用的数组都是不合法的。
(2)引用不可以有常量性或挥发性,所以不可以用关键字const或volatile来修饰引用。
(3)任何能作为左值的复杂表达式都能作为引用的初始化物
(4)char *cp = reinterpret_cast<char *>(a); // 对cp取地址则错误
reinterpret_cast<char *&>(a) = cp;// 正确,
(5)指向数组的引用保留了数组的尺寸信息,而指针则不保留(这个性质有时在数组名作为函数实参进行调用函数时使用)
(6)可以声明函数的引用:
ex: int f( double );
int (* const pf) (double) = f; // pf是指向函数f()的常量指针
int (&rf) (double) = f; // rf是函数f()的引用
可以把引用或函数本身(隐式)转换成指向函数的指针,再使用反引用语法。
(1)字母常量没有地址,永远不可以作左值
(2)int ci; const int *ip2 = &ci 的const只描述了通过ip2对ci的操作限制,而不是对ci的一般操作的限制。也就是说ci = 5可以,而*ip2 = 5不可以。
(1)如果?表达式中的两个选择结果都是左值,则该表达式本身就是个左值。
(2)case语句的标签必须是整形常量性的表达式(必须在编译时就要算出case中值)
(1)要提供一个放置各种适当前置声明的专用头文件
(2)把class的接口与其实现分离,从而要达到真正的数据隐藏之境,而其不二法门则是运用桥接设计模式
(3)使用桥接,任何对于Class C实现的修改,只要不改变Class C的接口,影响就会被牢牢地钳制在一个单独的实现文件。
通常的目标是:书写一个像包含一个单独的函数调用语句的宏。
这意味着:调用者需要提供最终的分号,而宏体则不需要。
因此宏体不能为简单的括弧包围的复合语句,因为如果这样,调用的时候就会发生语法错(明显是一个单独语句,但却多了一个分号)。每行的最后用\连接
一般用一个单独的用括弧括起来的”参数“定义和调用宏,参数在宏扩展的时候成为类似printf()那样的函数的整个参数列表。
#define DEBUG(args) (printf(“DEBUG: ”), printf arg)
if(n != 0) DEBUG((“n is %d\n”, n));
明显缺陷是必须记住使用一对额外的括弧。
getchar()可能返回任何字符,包括EOF
所以若后面紧跟着fgets(),则换行符会被fgets()取走。所以不要混用scanf和fgets,或者专门在scanf后用一个getchar()来接换行符
文本/二进制区别只是发生在文件打开时,打开后,一切i/o函数相同
对整型使用%d,长整形为%ld,浮点型为%f。
但是当目标串长度过大时,会用多个’\0’填充。
strcat就可以自动加’\0’
所以从十进制小数转成二进制再转回去就会不一样。
ex: if(fabs(a - b)) <= epsilon * fabs(a) )
使用次序必须是va_list, va_start(),va_arg(),va_end()
int vprintf(char *format, va_list param);
int vfprintf(FILE *stream, char *format, va_list param);
int vsprintf(char *string, char *format, va_list param);
int vscanf(char *format, va_list param);
int vsprintf(char *string, char *format, va_list param);
int vsscanf(char *s, char *format, va_list param);