分类: C/C++
2008-05-10 22:34:35
自己给自己建议的编程习惯
1/跟踪调试的地方
2/定义头文件之前的宏定义
3/定义宏之前的宏定义
4/调试开关
5/需要改进的地方
6/有循环的代码段,可以在循环外面预先定义循环变量,如果小于两个变量可以用register int i = 0;
尽量少用register,早释放其作用域,并且尽量靠内层循环。int out = 0;register int in = 0;
实际只需要在循环之前如果没有空余循环变量再现定义就行
7/数组名字一般要大写
8/文件名字一般第一个字母大写
9/头文件开始最好要有一个注释指明本头文件的名字
10/一个for或者if或者while等长的语句块结束过后应该在{}的后面注释上该语句块的含义如:
if(aa){...}//if(aa)
11/main函数的定义:int main(int argc, char** argv) {system("PAUSE");return 0;}
12/无参函数func();最好定义成func(void)
13/对于具有堆空间成员的类对象应该重载拷贝和=符号,防止出现深度拷贝问题。
或者在拷贝构造函数当中new也行,那样就不可以不用返回引用了。但是风格不好
还有初步认为对象的赋值如果没有new的堆成员,就可以直接赋值,不用考虑深度拷贝问题。否则就要如
上重载。
实际这个程序需要把拷贝构造函数实现深度拷贝的重载,因为有堆空间存在。
20070318 赋值运算符重载。
2.如下:代码段对堆栈进行拷贝,有错。
MyStack1 MyStack1::operator=(MyStack1 &opnd2)
{
this->length = opnd2.length;
delete []s;
s = NULL;
top = -1;
s = new StackNode[length];
cout<<"length"<
{
top++;
s[top] = opnd2.s[top];
}
cout<<"top"<
}
但是原来重载是返回MyStack1的对象,return *this.于是当执行完这个表达式之后(s1=s2),立刻s1内
的地址不变,数据却丢了。但是知道赋值重载返回引用类型就行。当然返回引用的return *this也可。
原因是return *this 的时候,把this付给了临时对象,临时对象没有深度拷贝,和this 指向了同一个
堆空间,表达式结束之后,临时变量析构了(delete),this的堆空间。因为我试过如果把析构里的
delete去掉也行(但这样显然是不好的)