重返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的处理来得更自然一些呢?
分享到:
相关推荐
C语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING.HC语言头文件 STRING....
但在性能敏感的场景下,可以直接调用`String`类的方法,如`String.IsNullOrEmpty()`,这样可以避免额外的类型转换,提升程序执行效率。 - 字符串相等性测试时,使用`string`比直接比较两个`String`对象更直观,因为...
C#中char[]与string之间的转换是一种常见的操作,我们经常需要在这两种数据类型之间进行转换。今天,我们将探讨C#中char[]与string之间的转换,包括string转换成Char[]和Char[]转换成string,同时也会涉及到byte[]与...
在Java编程中,经常需要处理JSON格式的数据,它是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON格式通常用于前后端数据交互,因为其结构清晰,支持复杂的数据结构,如对象(Object)...
在实际应用中,我们经常需要在HexString和Base64String之间进行转换。例如,当从网络接收数据时,可能接收到的是Base64编码的字符串,我们需要将其解码为原始的二进制数据;反之,当发送数据时,可能需要将二进制...
在Java编程语言中,`String`对象的创建是开发者经常遇到的问题,因为它涉及到内存管理和效率。`String`类在Java中被广泛使用,因为它代表不可变的字符序列,这使得它在很多场景下非常安全。这里我们将深入探讨`...
在 C++ 编程中,字符串是一种常用的数据类型,string、CString 和 char*都是字符串的 представители,每种类型都有其特点和使用场景。下面我们将详细介绍 string、CString 和 char* 的区别和联系。 ...
### C# String 的各种转换 在C#编程语言中,字符串与数字之间的转换是非常常见的操作。本文将详细介绍如何在C#中实现字符串与其他数据类型(如整数、浮点数等)之间的转换,并特别关注字符串与十六进制之间的转换。...
int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引 int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索 ...
public static String[] split(String s, String regex) s参数为待拆分字符串, regex参数有两种格式: 单字符的字符串(长度1),功能如下:split(“ab#12#453”, “#”) 返回带5个元素的数组:ab, #, 12, #, 453 ...
在编程领域,尤其是在C#语言中,`String`和`string`经常被提及,它们都是用来表示文本数据的类型,但两者之间存在微妙的区别。本文将深入探讨`String`和`string`的区别,并对`string`类型进行详尽的解释。 首先,`...
在 Java 编程语言中,`String[]` 数组和 `List` 集合之间的相互转换是非常常见的需求。这两种数据结构各有优势:数组提供了固定长度且访问效率高的特性,而列表则支持动态调整大小并且提供丰富的操作方法。了解它们...
### List转换成String数组 在Java编程中,我们经常需要对集合进行操作,尤其是在处理大量字符串数据时。本文将详细介绍如何将一个`List<String>`类型的集合转换为`String[]`数组,并通过不同的方法来实现这一过程。...
在C#编程语言中,`String`与`string`两者虽然在表面上看起来相似,但它们之间存在着细微而重要的差异。这些差异主要体现在它们的定义、使用场合以及编译过程中的处理方式上。本文将深入探讨C#中`String`与`string`...
本文将详细讨论如何在C++中将`double`类型的数值转换为`std::string`字符串,以及如何将`std::string`转换回`double`。我们将基于提供的`stringtodouble`工程文件进行讨论。 首先,让我们探讨`double`转`string`的...
之前在用C#写代码的时候,用过split函数,可以把一个字符串根据某个分隔符分成若干个字符串数组。在用C++操纵字符串的时候,我一直使用很笨的遍历的方法。为此,我问候过很多次C++标准委员会。直到某一天,我做了一...
在Java开发中,JavaBean和JsonString是两种常见的数据表示形式。JavaBean是Java对象的一种规范,用于封装数据,而JsonString是一种轻量级的数据交换格式,常用于前后端交互。本篇将深入探讨JavaBean与JsonString之间...
第二种形式是先在栈中创建一个对 String 类的对象引用变量 str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令 str 指向"abc",如果已经有"abc",则直接令 str 指向"abc"。 那么,为什么 String...
在Java编程语言中,经常需要将`List<String>`类型的数据转换为`String[]`数组类型,以便于进行某些特定的操作或适应某些方法的要求。本文将详细探讨这一转换过程,并通过几个具体的示例来帮助理解。 #### 一、基础...
基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用...