C++ string到底是什么?

要回答这个问题,先要了解什么是basic_string。
看一下basic_string的声明:

template < class charT,                          //定义字符串中字符的类型
class traits = char_traits<charT>, // basic_string::traits_type
class Alloc = allocator<charT> // basic_string::allocator_type
> class basic_string;

可见,basic_string实质上是一个类模板。
再解释的稍微详细一些:

1.关于char_traits

声明:

template <class charT> struct char_traits;

作用:

Character traits classes specify character properties and provide specific semantics for certain operations on characters and sequences of characters.(来自C++ Referencce,地址:http://www.cplusplus.com/reference/string/char_traits/)

即:它指定了字符的属性,并且提供了作用在字符或字符序列上的某些操作的特定语义。

2.关于allocator

声明:

template <class T> class allocator;//<memory>头文件下   allocator:分配器

作用:
Allocators are classes that define memory models to be used by some parts of the Standard Library, and most specifically, by STL containers.(来自C++ Referencce,地址:http://www.cplusplus.com/reference/memory/allocator/?kw=allocator)
即:它定义了用于标准库的部分内容,特别是STL的内存模型。

现在我们来看string的声明:

typedef basic_string<char, char_traits<char>, allocator<char>> string;

现在,我们明白了,原来是这么回事:

用基本类型char实例化类模板basic_string,得到一个具体的模板类,然后,将其typedef为string。

换句话说,string本质上是一个模板类,就是basic_string<char, char_traits<char>, allocator<char>>,string是对应的“简称”。 直观地理解,string的实例对象(就是说 string str;中的str)是一个char序列,但不同于char* str,stingr str带有许多封装好的针对自己的操作。

ps:basic_string还有其它实例,比如说:

typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>> wstring;

C++ string到底是什么的更多相关文章

  1. Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!

    写在前面 最近小伙伴加群时,我总是问一个问题:Java中的String类占用多大的内存空间?很多小伙伴的回答着实让我哭笑不得,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有说不知道 ...

  2. String到底在内存中是如何存储的

    String会出现在哪些地方 方法内的局部string 类内的字段String static string 容器中存储的string String数组 那么String的位置会影响其存储方式吗? 显然 ...

  3. C++string中有关字符串内容修改和替换的函数浅析

    1.assign() 原型: //string (1) basic_string& assign (const basic_string& str); //substring (2) ...

  4. C#文本处理(String)学习笔记

    摘要:string是编程中使用最频繁的类型.一个string表示一个恒定不变的字符序列集合.string类型直接继承自object,故他是一个引用类型,也就是说线程的堆栈上不会有任何字符串(直接继承自 ...

  5. java中String是对象还是类?详解java中的String

    有很多人搞不懂对象和类的定义.比如说java中String到底是对象还是类呢? 有人说String 既可以说是类,也可以说是对象. 其实他这么说也没问题, 类和对象其实都是一个抽象的概念. 我们可以把 ...

  6. C# 之String以及浅拷贝与深拷贝

     一.String到底是值类型还是引用类型 MSDN 中明确指出 String 是引用类型而不是值类型,但 String 表面上用起来却像是值类型,这又是什么原因呢? 首先从下面这个例子入手: //值 ...

  7. String、StringBuffer、StringBuilder区分和性能比较

    转载自:http://www.cnblogs.com/fancydeepin/archive/2013/04/23/min-snail-speak_String-StringBuffer-String ...

  8. C#中特殊的string类型

                                                                                  string C#有string关键字,在翻 ...

  9. [Java]String、 StringBuffer、StringBuilder的区别

    一.异同点: 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer.StringBuilder 长度是可变的; 3) StringBuffer ...

随机推荐

  1. Sharepoint 2013 回收站知识整理

    回收站机制可有利于防止内容的永久删除与误删除. 一.SharePoint 2013 回收站包括两种:第一回收站(End user Recycle Bin items)与 第二回收站(Deleted f ...

  2. 带清空按钮的EditText

    public class ClearEditText extends EditText implements OnFocusChangeListener, TextWatcher { // 删除按钮的 ...

  3. json.parse 与 json.stringfy

    转自 :http://blog.csdn.net/wangxiaohu__/article/details/7254598 parse用于从一个字符串中解析出json对象,如 var str = '{ ...

  4. 【行业交流】2016 TiD质量竞争力大会——移动互联网测试到质量的转变之路

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5691233.html TiD质量大会在北京召开,有幸去参加 ...

  5. libgdx 常见问题

    libgdx assets file not found Select Run -> Edit Configurations from the menu In the "Working ...

  6. 【Lamp】 Linux 下安装PHP+Apache+Mysql 手记

    [0]写在最前 由于准备实习原因,今天又重温了Lamp的搭建过程,之前一直是看燕十八老师2012年的教程学习,因此今天也是拿了十八哥的lamp搭建笔记作参考.但这次按照笔记重新搭建,发现了很多问题,由 ...

  7. CTeX学习心得总结

    CTeX 又称 CTeX中文套装,是基于 Windows 下的 MiKTeX 的发行版,集成了编辑器WinEdt 和 PostScript 处理软件 Ghostscript 和 GSview 等主要工 ...

  8. 部署keepalive+lvs

    部署keepalive+lvs 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.       欢迎降入:高级运维工程师之路 598432640     安装LVS的步骤我已经在另外的一 ...

  9. Android -- 仿ios上下反弹效果

    1,前几天在一个app上看到了滑动反弹效果,觉得这个效果挺不错的,然后想自己来实现一下,在网上查了一下基本上都是大致的说了下思路,自己看了一下,决定把实现的思路来详细的写下来,先看一下我们实现的效果吧 ...

  10. WIN7下java环境的搭建

    首先,你应该已经安装了 java 的 JDK 了,笔者安装的是:jdk-7u7-windows-x64 接下来主要讲怎么配置 java 的环境变量,也是为了以后哪天自己忘记了做个备份 1.进入“计算机 ...