我是C ++的新手,我注意到在处理字符串时你应该包括:
#include <string>
我的问题是为什么这是必要的,而不是像int
float
等原始类型?
谢谢
看起来你来自Python或Javascript背景,其中String是原始数据类型。
在C ++中并非如此,原始类型(在C ++中称为基本类型)中没有String。但int
,float
属于基本类型。
在C ++中,string
是一种类型,属于复合类型(与基本类型相对)类别。
有关C ++类型系统的概述,您可以阅读此reference on types。
像int
和float
这样的类型是直接嵌入到C ++语言本身的原始类型。它们非常简单,支持通常由处理器通过单个指令直接完成的基本操作。虽然std::string
界面可能会让它看起来像它一样简单,但实现实际上要复杂得多。
例如,int
在存储器中只能是4个字节,用于存储数字的二进制表示。同时,std::string
必须跟踪其长度,容量,并且在许多情况下有额外的内存可用于扩展。添加两个int
s可以使用单个处理器指令完成,而附加到std::string
可能涉及分配新的内存块以便存储更长的字符串,复制内容,然后释放原始内存块。
因为与使用int
和float
等基本类型的操作相比,字符串操作更复杂,所以std::string
作为C ++标准库容器提供,如std::vector
而不是原始类型,这就是为什么它有自己的头文件。
回答这个问题:“为什么这是必要的”我们可以参考C ++的创建者 - Bjarne Stroustrup和他的书“The's ++ Programming Programming”:
1.3 C ++ C ++的设计没有内置的高级数据类型,也没有高级的基本操作。例如,C ++语言不提供带有反转运算符的矩阵类型或带有连接运算符的字符串类型。如果用户想要这样的类型,则可以用语言本身来定义。实际上,定义新的通用或特定于应用程序的类型是C ++中最基本的编程活动。精心设计的用户定义类型与内置类型的区别仅在于它的定义方式,而不在于它的使用方式。
C ++遵循模块化原则,并且:“不为你不使用的东西买单”。如果用户需要某些功能形式标准库的另一种实现 - 他可以包括最好的第三方库。
在C ++中,任何需要库的东西通常都有一个#include
文件,必须使用才能导入(但是,这种工作方式绝对不能与Python import
语句相混淆,总体思路类似)各种声明图书馆中的实体。这是必要的,因为C和C ++是“静态类型”语言,因此在使用它之前必须提供声明说明您正在使用的东西的类型。如果不是,则编译器无法检查您使用的类型是否正确。
在某种意义上,C(以及扩展的C ++)可以被认为是“可移植汇编语言”。这意味着在C和C ++中被认为是语言原语的任何东西几乎总是被大多数CPU支持为原语的东西。这意味着CPU寄存器可以通过单个指令以适当的方式保存和操作的值。
在每个CPU上并非总是如此。例如,在CPU不能容纳32位整数的系统上有C和C ++的实现。但即使在那些系统上,long
至少仍然是32位整数,C编译器会发出几条指令,在多个步骤中将两个32位值相加。在C和C ++的早期阶段,浮点数通常被实现为一个非常低级的库,因为CPU不直接支持它们。
为了告诉你这有多重要,直到最近C ++还有一个register
关键字,这个关键字意味着编译器应该将一个给定变量的值保存在CPU寄存器中。
string
是一个任意长的字符序列。世界上很少(如果有的话)可以直接表示这种情况。所以它不是原始类型,而是由C ++代码库实现的类型。
如果您来自Python ...在Python中,没有语言结构甚至可以通过将内容存储在单个CPU寄存器中或使用单CPU指令执行操作来直接实现。因此,直接由语言支持的原始事物的概念要广泛得多。而库中某些东西与原始语言构造之间的区别也不那么明显。