一、表达式和基本语句
1、与零或空的比较:
bool:if(flag) if(!flag)
int:if(flag == 0) if(flag != 0)
float:if(flag > -a && flag < a) 可以定义float a = 0.00001(允许误差) 不能将float与0直接比较,因为精度不同。
指针:if(flag == NULL) if(flag != NULL)
2、for循环中,长循环放在最内层,可以减少cpu跨切循环的次数,循环应避免使用半开半闭区间。
for(int i=0; i<5; ++i)
{
for(int j=0; j<100; ++j)
{
........
}
}
3、逻辑判断放在循环外面,不可以打断循环流水线。
if(flag)
{
for(int i=0; i<100; ++i)
{
......
}
}
二、常量
1、const系统会自动进行安全检查,#define不会,容易产生边际效应。
在类中要使用常量,用枚举比较好,枚举不能有浮点型数据。
class A{
enum {SIZE = 100};
int array[SIZE];
};
三、函数
1、C语言无返回类型的函数会被默认成int,C++必须有返回类型。
2、return不能返回指向栈内存的指针或引用,因为函数执行完的时候自动销毁。
3、引用在创建的时候必须被初始化,不能为NULL,之后引用对应的值可以改,但是对象就不能改了。
int i = 1;
int &k = i;
fun(&k);
四、内存管理
1、内存分配方式有三种:静态存储区,栈,堆(动态内存)。
静态存储区上的变量在程序运行周期内都存在,比如static,全局变量。
堆上分配的内存也叫动态内存,new出来的,必须自己delete,防止内存泄露,delete会把指针变为野指针,所以必须delete p; p = NULL; 他的生存周期特别灵活,需要我们手动操作。
栈上分配的内存函数的局部变量都在栈上分配内存,在函数执行结束的时候自动释放,使用效率高,但分配内存容量有限。
2、指针
以指针作为参数的函数必须在函数口进行非空检查,防止空指针if(p != NULL)
指针释放后必须p = NULL,否则就是野指针。
3、定义数组的时候尽量初始化,防止为被初始化就是用。
4、不要用指针传递动态内存,用函数返回值来传递。
char* get(int n)
{
char* p = (char*)mallo(sizeof(char* n));
return p;
}
char* str = NULL;
str = get(100);
5、野指针
free和delete释放指针后,指针会变为野指针,所以一定要有NULL;
delete p;
p = NULL;
6、指针创建时要么初始化,要么NULL;
*p= &a; 或者 *p = NULL;
7、内存耗尽怎么办
A* a = new A();
if(a == NULL)
{
exit(1); //终止整个程序;
}
8、new数组
Obi* object = new Obj[100]; //创建100个动态对象
delete[] object; //释放所有对象
9、字符串
char* p = "hello"; //p指向常量字符串,位于静态存储区,内容为:hello\0
p[0] = ‘a‘; //是非法的 ,但编译器不会发现这个错误
char* a[] = "hello";
a[0] = ‘w‘ //合法
10、全局函数在调用的时候要加::标示符
::fun();