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