Cherno C++ P31 C++字符串

YouTube视频链接

C++字符串

本文是ChernoP31视频的学习笔记。
  在C++中有一种数据类型叫做char,它是一个字节的内存。字符串实际上是字符数组,我们通常将字符串称为const char*。加上const是为了不改变这些值,因为无法扩展字符串使其变大。char*并不意味着它是在堆上分配的,不能通过调用delete来删除。

const char* name = "Cherno";

字符串在内存中什么样

  如下代码

#include

int main()
{
	const char* name = "Cherno";
	std::cin.get();
}

  在第6行设置断点,运行程序就可以看到name的内存情况。在内存视图的地址栏中输入name,按下回车键。我们可以在内存视图的右边看到Cherno这个词,说明左边数字代表的是ASCII值。第7个字节被设为0,这被称为空终止字符,空终止字符是为了判断字符串的size。字符串从指针的内存地址开始,直到碰到0为止。
Cherno C++ P31 C++字符串_第1张图片

字符数组

  若我们创建的是包含字符的数组name2,这里没有空终止符,然后打印name2到控制台,会发现得到了Cherno,但是后面接了一大堆随机的字符。
Cherno C++ P31 C++字符串_第2张图片
  查看name2的内存视图,我们可以看到Cherno,然后接着一堆奇怪的符号。此时内存设置为cc,这实际上是一个数组守卫,让我们知道内存是在我们的分配之外。原因是name2的数组里面没有0,std::cout就不知道打印到哪儿结束。
Cherno C++ P31 C++字符串_第3张图片  若我们修改数组的大小,并在末尾写上0,就能正确的打印Cherno。
Cherno C++ P31 C++字符串_第4张图片

std::string

  在C++的标准库中有一个名为string的类,实际上有一个模板类叫BasicString。在c++中使用字符串应该使用std::string,它只是一个char数组和一些操作这些数组的函数。

std::string name="Cherno";

  string有一个构造函数,它接收char或const char参数,把鼠标悬停会发现实际上是一个const char数组而不是char数组。为什么通常把字符串赋值给const char* 而不是char*,因为本质上用双引号定义字符串时,在C++中是const char数组而不是char数组,这是通过char* 的隐式转换。
Cherno C++ P31 C++字符串_第5张图片
  再次打印name,这样比const char*的写法更简洁。
Cherno C++ P31 C++字符串_第6张图片

追加字符串

  若想在Cherno后面加上hello,这里可能会出错。因为我们是想把两个const char类型的数组相加,双引号里的东西是const char数组而不是真正的字符串,不能把两个指针相加,不能将两个数组直接相加。
Cherno C++ P31 C++字符串_第7张图片
  若想做这样的事,我们可以把它分成多行,这样做是将一个指针加到了name,name是一个字符串,把它加到字符串上,+=这个操作符在string类中被重载了。
Cherno C++ P31 C++字符串_第8张图片
  或者将两个相加的字符数组中的一个,显示的调用一个string构造函数,相当于创建一个字符串然后附加这个字符数组给它。
Cherno C++ P31 C++字符串_第9张图片
  我们也可以在字符串中用name.find()查找一个字符串,如果这个不等于std::string::npos,这个代表的是一个不存在的位置。name.find()返回的是no所在的首位置。

bool contains=name.find("no") != std::string::npos;

字符串作为参数传递

  如果我们写了一个叫PrintString的函数想要传递一个字符串,不会简单的写std::string string然后打印string。

void PrintString(std::string string) 
{
	std::cout << string << std::endl;
}

  因为这实际上是一个副本,如果这样把类(对象)传递给一个函数,实际上是在复制这个类(对象)。在函数中对这个类(对象)进行的操作不会传递到原始的类(对象)中。

void PrintString(const std::string& string) 
{
	std::cout << string << std::endl;
}

  可以通过常量引用来传递,在前面加上const和引用&。&告诉我们是一个引用,意味着它不会被复制,而const承诺我们不会修改它(string)。

你可能感兴趣的:(C++,c++,开发语言,后端,字符串)