首先,你知道下面的语句的语义是什么吗?

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);这样编译器就不会”神经质”地一通递归了。
  当变量的定义和函数的调用产生二义性时,编译器默认的行为是将其当成变量的定义来解释。

Tags: .
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Home

RFC: Request For Comments. Orz..

Name(required)
Mail (required),(will not be published)

RFC: Request For Comments. Orz..

Website(recommended)