一、前言
在正常的开发过程中,使用标准库是一件非常常见的事情,如果不会使用标准库,程序开发效率将大幅下降。
为了后面做一些有趣的小项目,所以本节将讲一些C/C++
中常用的标准库。
但这也只是为了给大家留下一个印象,更多的还是需要大家自己学习。
最主要的原因是,如果不经常用,即使现在会用了,过段时间也会忘了,所以如果后面的项目中遇到我觉得大家可能不怎么熟悉的地方,也会稍微讲一讲。
二、String
C/C++的标准库众多,所以我们就先挑一个稍微简单一点且非常常用的标准库:string
。
不过由于C/C++
标准库里面的源码到处使用宏、自定义结构体和模板,十分晦涩难懂,我们这里只是简单实现一下它的基础功能即可。
老规矩,不知不觉已经来到第七章了,那就新建一个项目day7
,将其设为启动项目、并添加源文件main.cpp
:
看名字string
就知道,这是一个字符串,其本质就是封装了对char*
的操作。
那么让我们先来使用一下它,看它有多方便吧,添加头文件string
:
#include<iostream>
#include<string>
using std::string;
using std::cout;
using std::endl;
int main() {
string s1="https://www.kucoding.com";
s1 += " 学习C/C++";
cout << s1 << endl;
}
同样的,string
也是在标准命名空间std
中,避免写着麻烦,我们就使用了using std::string
。
这里用到了一个写法 +=
,这其实也是一个运算符,等效于 s1=s1+" 学习C/C++";
,其实int
,double
等基本数据类型都可以这样写。
上面的几句话,如果换为char*
,使用C语言提供的字符串操作函数,就是下面这种写法:
#include<iostream>
using std::cout;
using std::endl;
int main() {
char buf[100]="https://www.kucoding.com";
strcat_s(buf,100," 学习C/C++");
cout << buf<<endl;
}
strcat_s
为函数strcat
的安全函数,用于拼接字符串。
这么一看,好像string
标准库也没什么优势,但如果继续下去,你就会发现string
的优越性。
比如:
- 我这里给缓存区
buf
给了100
个空间,这是我估计出来的,但string
不用我来估计。 - 只要电脑内存够大,
string
几乎可以无限自动追加,且这一过程是自动的,虽然我们用char*
,通过new
动态分配内存的方法也可以实现,但全程需要我们手动操作。 string
只需要像符合我们常规思路的使用即可比如用+=
追加字符串,但使用char*
,我们得自己记大量的字符串操作函数。
所以接下来,我们就试着实现一个自己的string
类,来实现一个常规的字符串类的基本功能。
首先,创建一个类String
,它需要有三个成员变量:
-
buf
:存放数据的缓存区 -
size
:当前字符串的长度(不含末尾0结束字符)
其目的是方便成员函数使用,比如增、删、改、查等操作都需要字符串的长度才能进行,与其每次都调用一下strlen
函数来计算,不如直接记录下来。
capacity
:缓存区容量,即缓存区的大小,方便时刻关注当前操作是否有可能超出缓存区的大小。
完成之后如下:
class String {
private:
char* buf; //存放数据的缓存区
int size; //当前使用了多少缓存区
int capacity; //缓存区的容量
public:
};
有了成员变量,我们就可以开始写它的构造函数了:
String() {
buf = new char[15];
capacity = 15;
size = 0;
}
String(const char* str) {
size=strlen(str);