大家来讨论下吧:)

darcymei 2003-10-18 04:51:16
看了前置++和后置++的运算符重载后,忽然想起以前老师说的话,能用++a的地方不要用a++,两者效率的确有差别阿:)同时也想到了另外一个问题,像后置++这种返回实值的函数,他们的返回值什么时候被销毁呢!个人认为表达式结束后就会,但想不出用什么代码来验证。请高手指点....
还有就是这里高手多多,能否请大家谈谈好的代码习惯(像写char a;int b;而不要int b;char a;)之类的。分给的少,还请见谅:)
...全文
51 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharkhuang 2003-10-19
  • 打赏
  • 举报
回复
看看more efect c++就ok
bosedom 2003-10-19
  • 打赏
  • 举报
回复
楼主的这个问题真是好啊!
playboyxp 2003-10-19
  • 打赏
  • 举报
回复
++a的地方不要用a++不是效率得问题
这是由于不同编译器得不同处理
有的是从左向右
有的是从右向左得
是否被释放要看他是什么样得变量了
如果是全局得则要到程序结束才会释放
局部得是再函数结束后释放
leyt 2003-10-19
  • 打赏
  • 举报
回复
学习中
killme6115 2003-10-19
  • 打赏
  • 举报
回复
to nmgpy(nmgpy) ( )
前置
friend 类名 &operator++(类名 &)
后置
friend 类名 operator++(类名 &,int =0)
Wolf0403 2003-10-19
  • 打赏
  • 举报
回复
代码来自 More Effective C++
条款六:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别
Wolf0403 2003-10-19
  • 打赏
  • 举报
回复
// 前缀形式:增加然后取回值
  UPInt& UPInt::operator++()
  {
   *this += 1; // 增加
   return *this; // 取回值
  }
  // 后缀形式:取值然后自增
  const UPInt UPInt::operator++(int)
  {
   UPInt oldValue = *this; // 取回值
   ++(*this); // 增加
   return oldValue; // 返回被取回的值。
   //这个函数结束之后,oldValue 如果没有被赋值就被析构了。
  }
darcymei 2003-10-19
  • 打赏
  • 举报
回复
谢谢各位的指导,effective正在看ing,的确有很多收获:)
发这贴也是想看看大家还有没有好的代码优化方法,希望高手不吝赐教,让我们这些菜鸟多多学习:)
darcymei 2003-10-19
  • 打赏
  • 举报
回复
to Jinhao(辣子鸡丁)
后置++产生的临时对象是在栈里的,只要当退出了函数operator++(int),这个对象就自动销毁了
有点不解
像a++*c这样的表达式,++返回的值必然在函数operator++(int)后依然存在.他们是什么时候被销毁呢?在整个表达式结束后?那编译器是如何判断的呢(我没学过编译原理,希望高手指点).
cgsw12345 2003-10-19
  • 打赏
  • 举报
回复
樓主,書還是要看的,這樣問題,在書中和標準庫的代碼中到處都有體現的。
Beover1984 2003-10-18
  • 打赏
  • 举报
回复
UP一下,学习中
kxw 2003-10-18
  • 打赏
  • 举报
回复
Jinhao(辣子鸡丁) :写的非常好
Jinhao 2003-10-18
  • 打赏
  • 举报
回复
下面的情况是++a和a++是没区别的(对进行了优化的编译器而言)
1,
int main()
{
++a;
a++;
}

2,
for(int a=0;a<10;a++)
for(int a=0;a<10;++a)
等等...
------------------------------------------------------------------
像后置++这种返回实值的函数,他们的返回值什么时候被销毁呢?
后置++产生的临时对象是在栈里的,只要当退出了函数operator++(int),这个对象就自动销毁了

deerlamp 2003-10-18
  • 打赏
  • 举报
回复
比如
main()函数, 最好用
int main()
{……
return 0;}

不要用 void main(){}
Wolf0403 2003-10-18
  • 打赏
  • 举报
回复
记得哪里看过,至少在单独的语句中,基本类型(int 为例)的前、后置 ++ 的汇编基本没有区别。
重载后置 ++:
ReturnType Class::operator++(int)
int 就是个标志,不需要参数变量。

林锐那个书,看看就 OK,不要当圣经。代码是给人看的,能方便的读懂就 OK。
cxjddd 2003-10-18
  • 打赏
  • 举报
回复
我觉得对于内部类型来说,a++ 与 ++a 的区别不是太大,编译器应该能够优化得很好。

主要是重载的 a++ 与 ++a,由于 a++ 的语义是 temp=a,++a,temp,所以 a++ 的效率要低。

对多数 iterator 来说,++a 的效率明显要高于 a++。
nmgpy 2003-10-18
  • 打赏
  • 举报
回复
从载操作符应该可以得到验证,但只知道++a如果从载不知道a++如何从载,请各位高手不吝赐教。
zhu1981 2003-10-18
  • 打赏
  • 举报
回复
楼主出言谦逊,
我想一定是好学之人,
单鄙人才疏学浅,
不能给你解难,
请愿量,
望高手能给你解难。
ttlb 2003-10-18
  • 打赏
  • 举报
回复
至于程序编写风格,我觉得不重要,因为当你读完一本经典的C++著作以后,风格估计就和大使差不多了:)
我觉得C++Primer不错。
ttlb 2003-10-18
  • 打赏
  • 举报
回复
++a 返回的是 a 自己,所以作用域一过,就销毁。
a++ 返回临时对象,当前语句执行完就销毁,搂主说的队。
int a = 1;
cout << a++; // 输出1
cout << a; // 输出2,临时对象已经销毁,所以没办法验证
加载更多回复(3)

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧