《C++ Primer》读书笔记-第三章 02 标准库类型string

来源:互联网 发布:医疗数据采集网关 编辑:程序博客网 时间:2024/05/17 04:02
作者:马志峰
链接:https://zhuanlan.zhihu.com/p/23471766
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:

  • 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
  • 原书有更加详细、精彩的释义,请大家购买正版书籍进行学习。
  • 本文仅作学习交流使用,禁止任何形式的转载
  1. 定义和初始化
  2. 支持的操作
  3. 处理string对象中的字符
    • 范围for语句
    • 下标运算符
    • 迭代器

定义和初始化

如何初始化类的对象是由类本身决定的

初始化string对象的方式

string s1;  string s2( s1 );  string s2 = s1;  string s3("value");  string s3 = "value";  string s4( n, 'c' )

上面的初始化形式可以分为两类:

  1. 拷贝初始化:使用等号初始化一个变量,编译器把等号右侧的初始值拷贝到新创建的对象中去
  2. 直接初始化:不使用等号

注意到只有s4没有提供拷贝初始化的形式,其实是有的,只是形式复杂而不被使用

string s4 = string( n, 'c' );

等号右侧的表达式负责创建一个临时对象,然后再执行拷贝初始化。这种方式复杂而且没有优势,因此不被使用

支持的操作

os << s  is >> s  getline( is, s )  s.empty()  s.size()  s[n]  s1 + s2  s1 = s2  s1 == s2   s1 != s2  <, <=, >, >=

详细释义见《C++ Primer》 P77, 表3.2

1. cin和getline

在cin >> s时,用户输入” Hello World! “,实际得到的s为”Hello”

如果想要得到完整的输入,可以使用getline函数

getline( cin, s )

2. size

size函数的返回值类型是string::size_type

size_type是在类string中定义的,它是一个无符号类型的值

不使用int等是为了做到与机器无关(int等的长度与机器有关)

3. s1 + s2

两个string对象相加,得到一个新的string对象,它的内容由两个string对象拼接而成

string对象可以和字面值相加

两个字面值不能相加

多个相加时注意加法的左结合律(同小学数学)

处理string中的字符

前面提到string是可变长的字符序列
有三种方式可以访问其中的字符

  1. 范围for语句
  2. 下标运算符
  3. 迭代器

范围for

for( declaration : expression )      statement

实例

string str( "some string" );  for( auto c : str )  {      cout << c << endl;  }

可以看出,declaration负责定义一个变量,
以便在statement中使用,
expression则代表待处理的序列

还可以在循环中改变字符串中的字符

for( auto &c : s )  {      c = toupper( c );  }  cout << s << endl;

注意,这里把c定义成了引用

下标运算符

string str( "some string" );  if( !s.empty() )  {      s[0] = toupper( s[0] );  }

下标运算符([])接收的输入参数是string::size_type类型的值,表示要访问的字符的位置,返回值是该位置上字符的引用

下标越界是c++中常见的错误,很容易导致整个程序崩溃,在使用时应当注意

下标应当大于等于0且小于s.size()

迭代器放在后续学完vector后讲解

下面看一下可以对字符进行的操作有哪些

isalnum( c )  isalpha( c )  iscntrl( c )  isdigit( c )  isgraph( c )  islower( c )  isprint( c )  ispunct( c )  isspace( c )  isupper( c )  isxdigit( c )  tolower( c )  toupper( c )

使用前需要包含头文件cctype

详细释义见《C++ Primer》第五版(中文版) P82,表3.3

作者说:

  1. 如果表达式中已经有了size()函数就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题

  2. 时刻注意检查下标的合法性

0 0