posts - 256, comments - 1319, trackbacks - 41, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

在String的面前丢脸

Posted on 2004-06-18 00:39 FantasySoft 阅读(2223) 评论(4)  编辑 收藏 所属分类: All About SoftPure C++

       重返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的处理来得更自然一些呢?
       

Feedback

#1楼    回复  引用  查看    

2004-06-18 01:20 by 阿呆      
stl并不是C++标准的一部分,如果overload operator+,一定会涉及内存分配的问题。

#2楼    回复  引用  查看    

2004-06-18 07:54 by Meyer      
string在java或则.net当中是内置类型,但在C++中却是char* 

#3楼    回复  引用    

2004-06-18 08:56 by 周星星 [未注册用户]
  +可以被重载,但全是内建型别的+不可以重载,如果内建型别之间的操作符被重载的话,一切都乱套了。
  假设可以重载,那么应该是
const string operator+( const char* a, const char* b )
还是
const char* operator+( const char* a, const char* b )

如果是第一个,那么就是说必须包含<string>才可以进行字符串的+操作,如果是第二个,那么返回值指向哪里?
  我觉得你有一个认识不是很深刻,这就是“字符串 和 stl::string 是两种完全不同的类型”
  std::string anotherMessage = " My " + " world," +  hello; 应当写成 std::string anotherMessage = std::string(" My ") + " world," +  hello;

#4楼    回复  引用  查看    

2004-06-18 09:17 by FantasySoft      
多谢几位牛人的指点,特别是星星,Thank you with all my heart!

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-10-14 17:23 编辑过
 
另存  打印