1,在使用变量前初始化他们。包括指针可初始化为NULL。 2,返回栈里的对象是危险的,尤其不能返回指针。 char *GetBuff(){char ascii[10];return ascii;}是错误的。 3,char类型的符号问题。 4,不要依赖表达式的运算次序,一般编译器都进行优化,先进行函数求值,再求复杂 表达式,再处理简单数据。 5,函数形参的求值是没有次序的。 6,转义符号必须小写。 7,三元转义, ??= #,??( [,??< {,??/ \,??) ],??> },??' ^,??! |,??- ~ 8,数组和数组的指针只有在形参使用中才是等价的,因为形参是不会把数组传入的。 9,数组下标运算符可以交换位置。 char*p = &2["kdkkd"]; 10,如果不想修改数组参数,就把它声名为 const. 11,常量指针 const int *p = & i; int const *p = &i;//不能通过指针修改整数 是等价的。 int *const p =&i 则不同。//不能使指针指向别的变量了。 12,避免浮点数相等的比较。 13,,运算符执行了其前后的表达式,仅返回右边的表达式的值。 14 ,注意typedef的应用。 int (*myfun)();和typedef int (*myfun)() MYFUN; 15,使用位来存储标志位方法是使用结构。 16,指针不可做+但可做-运算。并且弄清指针+1发生了什么。 17,关于想要修改指针的值的问题。void NextSpace(char ** pStr);调用时使用 char *p;NextSpace(&p);这样将修改指针本身,而不是指针指向的值。如果你 想在函数NextSpace中为p申请一块内存,并在返回后能使用p,就可以这样做。 c++ 18 , for ,while中声名的变量在出了循环后仍有效。 19,在条件语句中声名的变量仅在作用域内有效。 20,c++是不允许跳跃一个初始化变量语句的。在case中的声名的局部变量必须使用 括号封闭它。 21,要使用类库中的被保护的成员,可以从它继承一个类,声名一个返回该成员引用 型的共有函数。 22,成员指针 class A{ public : int a; } int A::*pint = &A::a; A a; int x = a.*pint; 事实上成员指针主要用途是指向成员函数的。 class A{public:void funcA(int);} void(A::*pFunc)(int) = &A::funcA; A a; A *pa = &a; (a.*pFunc)(8); (pa->*pFunc)(8); 23,静态的成员函数仅能访问静态的数据成员。 24,可以使用静态的指针指向活动的对象 class window{ public; static window* GetActive(){reutrn pActive;} void OnAcive() {pActive = this;} private : static window* pActive; } 25,建议使用const代替define 和enum. 26,c++调用c函数可声名 extern "C"{c的函数声名。} 27,为使头文件在c和c++中移植 #ifdef _cplusplus extern "C"{ #endif 头文件 #ifdef _cplusplus } #endif 28可能导致内存丢失的原因 1,忘记释放。 2 ,程序中有的分支不会释放已经分配的内存。(常见) 3,给已经指向了分配内存的指针分配内存。 29,类中的指针成员一定要初始化,可以是NULL。 30,当一个类中有指向其他资源的指针,并由类本身释放,那么要写拷贝构造函数。 31,在重载=运算符时,应考虑x= x型问题,解决的办法是判断是否是它自己,如果是 直接返回。 if(this = &argValue) return *this; 32,当类无须拷贝,则声名拷贝构造函数为私有并可不实现。 33,赋值运算符不能继承。 34,除构造函数,其他情况下给类的指针赋值必须删除原来的内容。 35,如果析构函数外释放指针,应该紧随其后,把它赋值为NULL。 36,可以使用一个初始化函数和关闭函数,而不写构造函数和析构函数。 37,使用delete [] Array释放用new分配的数组。 38,说明拷贝构造函数时必须说明为常量参数。 39,析构函数为虚。 40,如果对于类的对象之间的指针所指向的内容变化不大,可使用引用计数来确定拷贝 析构函数是否删除指针释放内存。