C++ string到底是什么

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;
时间: 2024-08-07 04:34:07

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

String到底创建了多少对象

Java代码   String str=new String("aaa"); 这行代码究竟创建了几个String对象呢?答案是2个,而不是3个.由于new String("aaa")相当于"aaa"与一个就是创建出来的放在堆时原实例对象,而另一个就是放在常量池中的 "aaa" 对象,当然这里的str本身只是一个引用,放在栈里,用来指向堆中创建出来的对象. 常量池(constant pool)指的是在编译期被确定,并被保存在已编

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

1.assign() 原型: //string (1) basic_string& assign (const basic_string& str); //substring (2) basic_string& assign (const basic_string& str, size_type subpos, size_type sublen); //c-string (3) basic_string& assign (const charT* s); //buf

重温java中的String,StringBuffer,StringBuilder类

任何一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类常用的有 3 个: String.StringBuffer.StringBuilder. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer.StringBuilder 长度是可变的; 3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的. String 类已在上一篇随笔 小瓜牛

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

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

String常量池

面试题:String到底创建了几个? String s1 = new String("hello"); String s2 = new String("hello"); /** * s1创建了两个对象,new String在堆中,然后引用着在常量池中创建"hello"区域. * 而s2,只创建一个对象,就是堆的new String();因为常量池已有hello存在,所以便直接引用 */ System.out.println(s1==s2);//f

Java中String和八大(九大)基本数据类型的关系

在java面试中,又让写/说出java中9大基本数据类型,以及他们相应的包装类! 看到这个题目我首先蒙了一下...WTF,公司不会犯这种低级错误吧,不是八大数据类型吗,何来9大,这个时候,估计是把String算到基本数据类型了, 所以要有利的反驳一下,当然口头辩驳是很不专业的,废话少说上代码: Object obj="AAAA"; //不会报错,因为 "AAAA" 生成出来就是一个对象 Object obj=100; //编译器报错,提示无法从int 类型强制转为O

Java六大问题你都懂了吗?

这些问题对于认真学习java的人都要必知的,当然如果你只是初学者就没必要那么严格了,那如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列. 一.到底要怎么样初始化! 本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量. 1. 类的属性,或者叫值域 2. 方法里的局部变量 3. 方法的参数 对于第一种变量,Java虚拟机会自动进行初始化.如果给出了初始值,则初始化为该初始值.如果没有给出,则把它初始化为该类型变量的默认初始值. 所有对象引用类型变量默认初始值为

LeetCode Valid Parentheses 有效括号

1 class Solution { 2 public: 3 void push(char c){ //插入结点 4 struct node *n=new struct node; 5 n->nex=0; 6 n->ch=c; 7 n->pre=last; 8 last->nex=n; 9 last=last->nex; 10 } 11 bool jud(char c){ //判断 12 struct node *m; 13 if(c==']') 14 c='['; 15 e

Java初学者都必须理解的六大问题 (整理自网络)

问题一:我声明了什么! 1. String s = "Helloworld!"; 许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”.这样模糊的回答通常是概念不清的根源.如果要准确的回答,一半的人大概会回答错误. 这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象.这就是真正发生的事情.我们并没有声明一个S