代码改变世界

在String的面前丢脸

2004-06-18 00:39  FantasySoft  阅读(...)  评论(...编辑  收藏

       重返C++的世界,自然离不开标准库,首当其冲的是std::string了。而我这两天硬是在string的面前不断丢脸。sigh~~
       
       std::string hello = "Hello";
       std::string message = hello + ", world" + "!";
       std::string anotherMessage = " My " + " world," +  hello;
      
        从Java的角度来看,message 和 anotherMessage应该都是可以编译通过的。而在C++的标准库中,两个字符串的直接量是不可以相加的。因此,对于这三行代码,我的结论经历了能够编译通过到不能编译通过的转变。而第二和第三个Statement都是有问题的。
        但是,当我将这三行代码在VC上编译的时候,情况是如我所料的确实无法编译,可是问题只是出在了第三句,而第二句是没有问题的。一开始,我很纳闷,细心一想,才发现自己的愚昧。
       
         v = s + t: s为string类型,而t可以是string类型,也可以是字符串常量,相加的结果为string类型。因此,第二句根本就没有出现两个字符串直接量相加的情况。What a shame!

        我的疑惑还没有结束,编译提示的错误是:cannot add two pointers。我搜肠刮肚地从以前那点可怜的C++知识中去寻找,都想不出一个所以然。倒是从我的相对丰富一点点的Java知识当中,我找到了这样的类比,Java中的String类型是Immutable,即是不可以改变的。而两个String类型的常量相加,也是因为使用了一个StringBuffer类型的临时变量,这个可以从编译后的Byte Code中得知。因此,我得出的结论就是:在C++中,字符串常量(" hello")被编译器认为是 const char *,当两个字符串直接量相加的时候,并没有一个临时的char * 变量去容纳这个结果,而任一个字符串常量都是const的,因此就无法改变,从而造成编译出错。 
        
        咋一看,这样的结论还算过得去,然而我又错了。当我使用这样的代码做试验的时候:
        char * hello = "Hello";
        char * world = "world";
        char * message =  hello + world;
        错误是依然存在的。再进一步思考一下,真的觉得好丢脸。所谓指针,就是内存空间的地址,两个毫不相关的地址相加的结果有意义吗?我想,这就是编译器不允许两个指针相加的原因吧。

        兜兜转转,想了大半天,居然是这样的一个结果,觉得挺shame的。不过无所谓了,反正偶是菜鸟,也不怕各位高手耻笑了。呵呵~~~ 以上是一些丑陋的思维过程,请前辈多多指摘,偶不胜感激了!

        PS:既然运算符"+"被重载了,为什么不能够做得像Java一样,对于string的处理来得更自然一些呢?