本文主要是介绍初识string(一)and内存管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
对类和对象的补充:缺省参数在函数定义中从右向左依次赋值,如果从右向左有一个参数没有赋值缺省参数,则左边的变量就不能在赋缺省参数,类中的变量可以赋缺省参数并且没有限制。
在类定义中我们总是看到函数后加const。这其实是调用常量类对象或类对象的意思。
一、引言
俗话说“工欲善其事,必先利其器。”一门语言创造的初衷一定是为了交流和记录重要的事。计算机语言肯定也不例外,虽然计算机语言创造的初衷单纯只是为了和计算机交流,让计算机代替人类进行复杂的运算。但渐渐的记录存储功能开始成为计算机的一大功能。计算机毕竟是外国人进行研究的,外国人自然而然会为了更好的存储文字、修改文字、加密文字、删除文字创造出新的类。
二、string的介绍
string英文单词的释义是字符串。在C语言中的字符数组要想快速改变内容先不说是否要进行扩容,但是修改值都变得异常困难。所以在C++中提供了string类,方便了字符串的修改与删除。
在此接触string之前,我们先要了解内存管理——new和delete。还有一个operator new用的不是很多了解了解就行。
在C语言中我们用内存管理会用malloc()、calloc()、realloc()、free()等函数在内存的堆区申请空间。并且通过函数的返回值是否为空(NULL)来判断内存是否申请成功。
在C++中我们用new、operator new 、delete操作符进行内存管理。用抛异常来检查申请是否成功。下面是演示new和delete(如果申请的不止一个元素或是对象,析构时delete要则要加[],否则程序可能会崩溃。)操作符用法的代码。使用operrator new()和malloc()函数用法和操作是一样的,申请对应的空间大小强转返回值就行了。此外,new还可以用来申请类和对象空间,并且申请对象也会调用构造函数。
int* ptr = nullptr;
try//检测是否存在抛异常
{ptr = new int[n] {初始化值(如果是一个值初始化时用“()”)};//n为对象的个数
}
catch(const std::exception& e)//检测是否存在抛异常
{std::cout << e.what() << std::endl;
}
delete[] ptr;
下面我们就正式来进入string,首先我们需要包含头文件<string>,因为C++有意作区分C语言和C++,所以string没有加.h后缀。
二、1 string文件中的那些函数
stoi()函数相当于C语言中的atoi()函数,将提取字符串的数字。返回值是个int类型。暂时只介绍这一个string文件中的函数。因为它相对于其他函数用的比较多。
二、2 string类对象的那些函数
一个类中一定会有构造函数、拷贝构造函数、析构函数、赋值运算符重载。这里就不一一介绍了。
我们先从最简单的访问函数size()和capacity(),用来访问类中的private变量或函数的数据来介绍。如果没有容积、大小的标示或是标示不统一,所有容器都只能凭借肉眼来一眼丁真。这非常的不方便。所以在string的类中会添加_size和_capacity变量来申请新的内存空间大小、访问内容、调整字符串的长度,同时不能被任意访问或修改,所以在private部分申明。
和字符数组一样,string也可以通过下标访问。另外可以通过string中的resize()函数来调整size的大小。
#include<iostream>
#include<string>
int main()
{char ch[10] = "abcdefg";string s1(ch);for(int i = 0;i < s1.size();++i){std::cout << s1[i] << std::endl;} return 0;
}
insert和erase则是在指定位置之前插入和在指定位置删除,返回值为插入或删除的值所在位置的迭代器。(一种类似指针的类型变量)我们还应该注意insert()和erase()如果扩容或是删除,可能会导致访问string的迭代器从原本的位置指向其他位置,也就是叫迭代器失效。
//迭代器的英文为iterator,故用它来定义迭代器变量。
//begin()和end()都是返回容器开头和结尾的迭代器函数。
string::iterator (变量名) = (类对象名).begin();
使用示例:
用迭代器打印string中的字符
#include<string>int main()
{std::string s1("abcdefg");std::string::iterator it = s1.begin();while(it != s1.end()){std::cout << it << " ";++it;}return 0;
}
push_back()则是向单个字符元素后插入。
string s1;
s1.push_back('a');
+=则可以向后插入字符串、字符都可以。
std::string s1;
s1 += "abcdefg";
s1 += 'a';
substr()则是对字符串中的开始提取字符,第一个参数是下标,第二个参数则是结束位置的下标。
std::string s1("abcdefg");
//提取s1中的所有字符
std::string s2 = s1.substr(0);
//提取s1中下标为1到下标为三的字符
std::string s3 = s1.substr(1,3);
find()函数则是查找字符串或是字符。第一个参数是字符或字符串,第二个参数则是开始位置的下标。
std::string s1("abcdefg");
//从下标为零的的位置开始查找字符或字符串
size_t pos = s1.find('c');
//从下标为一的的位置开始查找字符或字符串
size_t pos = s1.find('c',1);
c_str()则是返回类对象中的字符串。
std::string s1("abcdefghjijk");
//打印string中的字符串
std::cout << s1.c_str() << std::endl;
这些函数都是需要string类对象用点(.)操作符访问的。
这篇关于初识string(一)and内存管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!