我想一开始得模仿一下别人的编译器吧,所以得弄明白一门程序的本质!
/images/2011/147787/2011051411021524.jpg" border="0" />
哦.. 也不失为一种方法
送你一份简单词法分析源代码作为参考. 应该对你写编译器有帮助..
have your ever overloaded the ++ and -- (totally 4 operators) for a class, say A? If you did this, then you understand what I said.
Try to do the following exercise:
[CODE]class A
{
// overload ++(two versions)
private:
int d;
double d;
};[/CODE]
your declaration for the postfix ++ must be
[CODE]const A operator++(int); /// postfix [/CODE]
(here we used a dummy int argument to mark it as the postfix version, otherwise, you cannot
make it different from the prefix version. )
for the prefix version must be
[CODE]A& operator++() /// prefix[/CODE]
All other variants are wrong. You may ask me why this has to be so? I would have to tell you, the writers for the compliers, both MS C++ and g++, implemented it so.
/**
This is an option for the postfix ++. But since it returns void,
we cannot use it in an expression, say (a++) + 1.
*/
//void operator++(int)
//{
// ++(*this);
//}
看了下你的解释,我想说点看法:
首先,我不明白你为什么把后自增的返回值认为是一个常量?你在说明++重载的时候
const A operator++(int);
我也写过++重载,但是我从来都
A& operator++();
A operator++(int);
所以,我认为问题关键不在这里,并且由此又引出一个问题,内置类型和类类型对++的理解。
想起以前一个帖子:(yuyunliuhen 斑竹连接出来那个)
在那个问题里,大家都说清楚了前自增,后自增的区别。
前自增返回变量本身,后自增返回临时变量。
但是我想即使是临时变量,也应该可以取地址的啊。
比如 int b = a++;
然后 &b 是允许的吧!
所以这点并不足以解释。如果用HJun的返回常量理论,也一样有这个问题。
我用类重载++时,
++a++ //== ++(a++)这样用是可以的。
所以我觉得,内置类型中++的实现不同与类类型中++重载。
至于,再深一步的,就看大家了!
ps:不对的请指教,刚才写段小代码突然想到了。
[此贴子已经被作者于2007-6-16 16:59:41编辑过]
我知道你所谓实用点.不外是写写erp如此之类的.如果所谓实用点,我根本用不着来学习C++,我去学.net就行了.
我已经说得很明白了,我想知道的是一些本质的东西.当你在用一个按钮时,可曾想过
这个按钮是怎么来的.你又何曾想过.net是如何来的.C++又是如何来的.我就是不想知其然,不知其所以然.
或者我只能对你说,道不同不相为谋.