Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5494230
  • 博文数量: 922
  • 博客积分: 19333
  • 博客等级: 上将
  • 技术积分: 11226
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 14:33
文章分类

全部博文(922)

文章存档

2023年(1)

2020年(2)

2019年(1)

2017年(1)

2016年(3)

2015年(10)

2014年(17)

2013年(49)

2012年(291)

2011年(266)

2010年(95)

2009年(54)

2008年(132)

分类: 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/对于具有堆空间成员的类对象应该重载拷贝和=符号,防止出现深度拷贝问题。

  • 以下正确:
    MyStack1& MyStack1::operator=(MyStack1 &opnd2)
    {
     ....
     return opnd2;//或者return *this;
    }
    这样实现了两个堆对象的赋值重载。

    或者在拷贝构造函数当中new也行,那样就不可以不用返回引用了。但是风格不好


    还有初步认为对象的赋值如果没有new的堆成员,就可以直接赋值,不用考虑深度拷贝问题。否则就要如

    上重载。
    实际这个程序需要把拷贝构造函数实现深度拷贝的重载,因为有堆空间存在。


    ---- quietheart () 评论于 2007-05-10 16:28:57
  • 20070318 赋值运算符重载。
    2.如下:代码段对堆栈进行拷贝,有错。
    MyStack1 MyStack1::operator=(MyStack1 &opnd2)
    {
     this->length = opnd2.length;
     delete []s;
     s = NULL;
     top = -1;
     s = new StackNode[length];
     cout<<"length"< while(top < opnd2.top)
     { 
      top++;
      s[top] = opnd2.s[top];
     }
     cout<<"top"< return *this;
    }

    但是原来重载是返回MyStack1的对象,return *this.于是当执行完这个表达式之后(s1=s2),立刻s1内

    的地址不变,数据却丢了。但是知道赋值重载返回引用类型就行。当然返回引用的return *this也可。
    原因是return *this 的时候,把this付给了临时对象,临时对象没有深度拷贝,和this  指向了同一个

    堆空间,表达式结束之后,临时变量析构了(delete),this的堆空间。因为我试过如果把析构里的

    delete去掉也行(但这样显然是不好的)


    ---- quietheart () 评论于 2007-05-10 16:28:35
阅读(1206) | 评论(0) | 转发(0) |
0

上一篇:可惜

下一篇:转让费的由来

给主人留下些什么吧!~~