首先,你知道下面的语句的语义是什么吗?
int (a); |
或许写成这样你会更明白一点:
int (a) = 0; |
它等同于
int a = 0; |
即,在C/C++中,声明变量时允许你在变量名周围加上一对()。这样,我们的问题就来了。看下面这个奇怪的snippet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int G = 0xFF; class Mary { public: Mary() { Mary(G); } Mary(int n){ /*Constructing... */} }; int main(int argc, char **argv) { Mary M; return 0; } |
这个程序有什么问题?看似很正常。在Mary::Mary()中调用Mary::Mary(int),让Mary::Mary(int)进行构造工作。编译运行这个程序,你会得到Segment fault的错误。为什么?因为编译器将语句Mary(G); 当成变量定义来编译了。结果就是,Mary::Mary()会被无穷递归地调用,最终造成栈溢出。如果将Mary(G);改成Mary::Mary(G);呢?这样不但无济于事,而且恰恰更具有迷惑性。
解决方法就是,通知编译器,这不是一般的变量定义,而是一个函数调用。比如把Mary(G)换成Mary(static_cast<int>G);这样编译器就不会”神经质”地一通递归了。
当变量的定义和函数的调用产生二义性时,编译器默认的行为是将其当成变量的定义来解释。
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
我用vc6.0编译没出现error
弱弱的问一句:M 不用new?
明白了,改补补C++了。。
我正想开个培训班 ^_^
好啊,开补课班吧。怎么验证都是vim?
学习了!的确是无限调用!
C++有时候真是蛋疼,这个加括号的语义有什么作用,还带来歧义,画蛇添足?