我是C++的新手,我注意到在使用字符串时,应该包括:
#include <string>
我的问题是,为什么这是必要的,而不是像int
,float
等这样的原语类型?
谢谢
发布于 2019-04-30 12:49:06
看起来您来自Python或Javascript背景,其中String是原始数据类型。
在基本类型(在C++中称为基础类型)中没有字符串的C++中就不是这样了。但是int
,float
属于基本类型。
在C++中,string
是属于复合类型(而不是基本类型)类别的类类型。
有关C++类型系统的概述,请阅读此reference on types。
发布于 2019-04-30 12:48:25
像int
和float
这样的类型是直接嵌入到C++语言本身的基本类型。它们非常简单,支持通常由处理器用一条指令直接完成的基本操作。虽然std::string
接口可能让它看起来很简单,但实际上实现要复杂得多。
例如,int
在存储数字的二进制表示形式的内存中可以只有4个字节。同时,std::string
必须跟踪其长度和容量,并且在许多情况下具有额外的可用内存以允许扩展。添加两个int
可以用单个处理器指令来完成,同时附加到std::string
可能涉及分配新的内存块以便存储更长的字符串,复制内容,然后释放原始内存块。
由于与int
和float
等原始类型的操作相比,字符串操作更为复杂,因此std::string
是作为C++标准库容器(如std::vector
)提供的,而不是原始类型,这就是它有自己的头文件的原因。
发布于 2019-06-05 08:31:04
在C++中,任何需要库的东西通常都有一个#include
文件,必须使用该文件才能导入库中各种实体的声明(不过,这种工作方式绝对不应该与Python import
语句混淆,总体思想类似)。这是必要的,因为C和C++是“静态类型”语言,所以声明你正在使用的东西的类型必须在你使用它之前可用。如果不是,编译器就无法检查您使用的类型是否正确。
在某种意义上,C(以及扩展的C++)可以被认为是“可移植的汇编语言”。这意味着在C和C++中被认为是语言原语的任何东西几乎总是被大多数CPU作为原语支持的。这意味着CPU寄存器可以通过一条指令以适当的方式保存和操作一个值。
并不是每个CPU都是这样的。例如,在系统上有C和C++的实现,它们的CPU不能容纳32位整数。但是,即使在这些系统上,long
至少仍然是一个典型的32位整数,C编译器将发出几条指令,在多个步骤中将两个32位值相加。在C和C++的早期,浮点数通常是作为一个非常低级的库实现的,因为CPU不直接支持它们。
为了告诉您这有多重要,直到最近,C++都有一个register
关键字,它的意思是提示编译器给定变量的值应该保存在CPU寄存器中。
string
是任意长度的字符序列。世界上几乎没有(如果有的话)CPU可以直接表示这一点。因此,它不是原始类型,而是由C++代码库实现的类型。
如果你来自Python...在Python中,甚至没有语言构造可以通过将内容存储在单独的CPU寄存器中或使用单个CPU指令执行操作来直接实现。因此,语言直接支持的原始事物的概念要宽泛得多。库中的东西和原始语言构造之间的区别也不是很明显。
https://stackoverflow.com/questions/55913974
复制相似问题