第4章 复合类型——字符串(二)string类简介

本文介绍了C++中字符串处理的两种方式,C风格字符串与string类,包括它们的初始化、赋值、拼接以及C++11的新特性。特别强调了string类的安全性和便利性,并解释了string对象与基本类型输入流操作的区别。
摘要由CSDN通过智能技术生成

本文章是作者根据史蒂芬·普拉达所著的《C++ Primer Plus》而整理出的读书笔记,如果您在浏览过程中发现了什么错误,烦请告知。另外,此书由浅入深,非常适合有C语言基础的人学习,感兴趣的朋友可以自行阅读此书籍。

字符串

字符串是存储在内存的连续字节中的一系列字符。

C++处理字符串的方式有两种:

  1. 来自于C语言的C风格字符串。
  2. 基于string类库的方法。

本文接着了解string类。

string类

基础知识

ISO/ANSI C++98标准通过添加string类扩展了C++库。要使用string类,必须在程序中包含头文件。string类位于名称空间std中,因此我们必须提供一条using编译指令,或者使用std::string来引用它。string类定义隐藏了字符串的数组性质,我们可以像处理普通变量那样处理字符串。

下面代码说明了string对象与字符数组之间的一些相同点和不同点:

char charr1[20];
char charr2[20] = "hello";
charr2[2] = 'a';
cout << strlen(charr1);              //不确定
cin >> charr1;
cout << charr2;

string str1;
string str2 = "Tom";
str2[1] = 'i';
cout << str1.size();                //0
cin >> str1;
cout << charr2;

在很多方面,使用string对象的方式和使用字符数组的相同:

  • 可以使用C风格字符串来初始化string对象。
  • 可以使用cin将键盘输入村粗到string对象中。
  • 可以使用cout来显示string对象。
  • 可以使用数组表示法来访问存储在string对象中的字符。

string对象和字符数组之间的主要区别是:

  • 可以将string对象声明为简单变量,而不是数组。
  • 类设计可以让程序能够自动处理string的大小,与数组相比,使用string对象更方便,也更安全。
  • 可以将char数组视为一组用于存储一个字符串的char存储单元,而string类对象是一个表示字符串的实体。
  • 未被初始化的数组内容是未定义的,因此strlen的结果未知。而未被初始化的string对象的长度被自动设置为0。

C++11字符串初始化

C++11允许将列表初始化用于C风格字符串和string对象。 如下所示:
string str1 = {"this is an example"};
string str2{"this is an example too"};

赋值、拼接和附加

//C风格字符串的做法:
char charr1[50] = "The C++ is a great language!";
char charr2[50] = "Yes, you are right!";
char charr3[50];
char charr4[100]; 

strcpy(charr3, charr1);
strcpy(charr4, charr1);
strcat(charr4, charr2);

//string对象的做法:
string str1 = "The C++ is not a great language!";
string str2 = "No, you are wrong!";
string str3;

str2 = str1;
str3 = str1 + str2;
str1 += str2;

可以看到,string对象在处理字符串时,更加便捷。

string类I/O

对于char类型数组,我们可以使用cin.getline(charr2, 20)的方式从键盘输入数据。但对于string对象,我们只能使用getline(cin, str)。第一个getline是istream类的一个类方法,但第二个只是个普通函数。

为什么string对象不能使用istream类方法呢?

那是因为,在引入string类前,C++已经有了istream类。因此istream的设计考虑到了诸如double和int等基本C++数据类型,但没有考虑string类型,所以istream类中,有处理double、int和其他基本类型的类方法,但没有处理string类型的类方法。

那么问题来了,为什么前面的程序中,可以使用cin >> str1给string对象赋值呢?

那是因为,这里使用了string类的一个友元函数。有关友元函数及这种技术为何可行,将在第11章介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值