C++中字符串详解

在C语言中只能通过字符串数组来模拟字符串,没有字符串类型。在C++引入了string类来表示字符串类型。从而用它定义字符串。
在C语言中:

char str[] = "abc";
char str[] = {'a''b','c','\0'};
char* str = "abc";
//这三种形式是C语言下用来表示字符串的方式。

而在C++语言下:

string str1;//调用无参构造,生成一个空字符串对象,strlen(str) = 0;
string str1 = "";//调用有参构造,虽然作用相当于上面的,生成一个空字符串对象。等价于string str1("");
string str2 = "abc";//调用有参构造
string str3("abc");//调用有参构造
string str4 = string("abc");//调用有参构造
string str5 = str4;//调用拷贝构造
string str6(str5);//调用拷贝构造
//以上这种方式都是定义字符串string类的对象。

注意: “” 即空字符串也是一个字符串字面值,也会被存储到静态存储区只存一份实例。

string类是基于模板的。是basic_string类的别名。
string类里有以下三个常用到的构造函数:

string(){_data = new char[1]; _data[0]='\0';};//无参构造
string(const char * str){//有参构造_data = new char[sizeof(str)];for(int i = 0; i < sizeof(str);i++){_data[i] = str[i];}
};
string(const string & str){//拷贝构造_data = new char[strlen(str)+1];strcpy(_data,str);
};

C++中的string类底层存储字符串的原理是,存储一个 char * 类型的成员指针变量(如上述构造函数中的_data)。
而 char * 类型的指针变量 会指向一块堆内存。在堆内存中存储字符串内容。当string类对象生命周期结束时,会调用 其析构函数,delete 掉 char *类型的指针变量。释放存储字符串内容的堆内存。
在这里插入图片描述

注意:string对象中的字符串实际是存储于堆内存中的。何时会释放掉这块堆内存,只要string类的对象的声明周期结束即将时,它会自动调用string类的析构函数,来释放成员变量_data所指向的那块堆内存。
拷贝构造函数的调用机制,是必须根据当前已有的一个对象来对另一个新对象进行拷贝赋值。

下面说一下:
字符串的引用类型的使用

string & refstr = "abc";//编译不过,“abc” 不是左值
const string & refstr = "abc";//可以,会根据string的有参构造函数生成一个匿名对象。然后refstr就是这个匿名对象的别。通过refstr来访问匿名对象的地址。等价于 const string & refstr = string("abc");
如果想这个样单独的一条语句string("abc");//匿名对象,这一行表达式语句执行完毕后,string对象的生命周期就结束了。
那么像上面那样 refstr可以延迟这个匿名对象生命周期。直到refstr引用变量的声明周期结束后,那个匿名对象的声明周期也就结束了。
void func(const string & refstr){............
}string str = "abc";
func(str);//这种方式传参不存在对象创建。通过 refstr 来访问 str内容。
func("abc");//这种方式传参存在一次调用有参构造创建string类型的匿名对象。相等于func(string("abc"));通过refstr来访问这个匿名对象。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

因为高考考砸了,我学了计算机

2015年&#xff0c;是我高中的最后一年。 2023年&#xff0c;我已在计算机领域工作十多个年头。 我出生在东部省份的一个不沿海小县城&#xff0c;在那里度过了我高考前的17年。起点平平&#xff0c;没有任何特长傍身&#xff0c;也可以说是毫无亮点&#xff1b;成绩中等&#…

中文语音标注工具FunASR(语音识别)

全称 A Fundamental End-to-End Speech Recognition Toolkit&#xff08;一个语音识别工具&#xff09; 可能大家用过whisper&#xff08;openAi&#xff09;&#xff0c;它【标注英语的确很完美】&#xff0c;【但中文会出现标注错误】或搞了个没说的词替换上去&#xff0c;所…

APP备案,最新获取安卓签名文件中MD5等信息方法

1.通过签名文件获取SHA1和SHA256 直接通过cmd执行命令 keytool -list -v -keystore xxxxx/xxx/xx/xxx.keystore输入后回车会提示输入密码库口令&#xff0c;直接输入Keystore密码&#xff08;输入过程中终端上不会显示&#xff0c;输完回车就行&#xff09; 2.获取md5 由于…

redis集群(cluster)笔记

1. 定义&#xff1a; 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个Redis节点间共享数据的程序…

IDEA启动失败报错解决思路

IDEA启动失败报错解决思路 背景&#xff1a;在IDEA里安装插件失败&#xff0c;重启后直接进不去了&#xff0c;然后分析问题解决问题的过程记录下来。方便下次遇到快速解决。也是一种解决问题的思路&#xff0c;分享出去。 启动报错信息 Internal error. Please refer to https…

ke14--10章-1数据库JDBC介绍

注册数据库(两种方式),获取连接,通过Connection对象获取Statement对象,使用Statement执行SQL语句。操作ResultSet结果集 ,回收数据库资源. 需要语句: 1Class.forName("DriverName");2Connection conn DriverManager.getConnection(String url, String user, String…

使用人工智能优化常见业务流程

在现代商业环境中&#xff0c;人工智能(AI)正在改变企业的运营方式。将人工智能集成到业务流程中可以提高效率和准确性&#xff0c;从而节省大量时间和成本。 这使员工能够专注于更具战略性的任务。人工智能在商业中的应用范围从自动化日常任务到提供高级分析&#xff0c;以做…

【mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar安装】linux安装mysql5.7

之前安装的时候遇到了很多问题&#xff0c;浪费了一些时间。整理出这份教程&#xff0c;照着做基本一遍过。 这是安装包: 链接&#xff1a;https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包&#xff0c;上传到linux。我这里就放到downloads目录下面…

邮政快递单号查询入口,删除不需要的单号

批量查询邮政快递单号的物流信息&#xff0c;并删除不需要的单号。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&#xff0c;然后登录…

SimpleSQL

游戏和应用中的SQL集成 simpleSQL可将数据库存储集成到您的游戏或项目中。创建水平地图链接,存储球员的统计资料,保持库存规格,以及更多! 请注意,simpleSQL是本地数据库解决方案,不能连接到服务器数据库 将SQLite数据库附加到场景中的管理器 无需移动移动设备上的文件! 使…

LeetCode力扣每日一题(Java):20、有效的括号

一、题目 二、解题思路 1、我的思路 我看到题目之后&#xff0c;想着这可能是力扣里唯一一道我能秒杀的题目了 于是一波操作猛如虎写出了如下代码 public boolean isValid(String s) {char[] c s.toCharArray();for(int i0;i<c.length;i){switch (c[i]){case (:if(c[i]…

玩法题材创新的跑酷游戏,广告变现不止带来收益 | TopOn变现干货

跑酷游戏是一类永不落伍的游戏。从远古的红白机到现代的PC、手机&#xff0c;经典作品层出不穷&#xff0c;而提起手机端的跑酷游戏&#xff0c;相信大部分玩家脑海里的第一印象便是《神庙逃亡》和《地铁跑酷》这两款经典游戏&#xff0c;在上蹿下跳、左右挪移间躲避障碍&#…

2023年12月7日:QT实现登陆界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口设置this->resize(600,500);//重新设置窗口大小this->setWindowTitle("QQ-盗版");//设置窗口名为QQ-盗版this->setWindowIcon(QIcon("D:\\Qt\\funny\\pi…

VOS3000 在安装AXB时需要几个步骤

安装 VOS3000 AXB 模板需要按照以下步骤进行操作&#xff1a; 首先&#xff0c;确保你已经在服务器上安装了 CentOS 或者其他 Linux 操作系统&#xff0c;并且已经完成了基本的系统设置和网络配置。 下载 VOS3000 软件包&#xff0c;并解压缩到服务器上的指定目录中。 进入…

[虚拟机]使用VM打开虚拟机电脑重启解决方案。

问题&#xff1a;打开虚拟机点击启动后&#xff0c;电脑会自动重启。&#xff08;WINDOWS10 20版本&#xff09; 解决步骤&#xff1a; 1、对Windows功能进行操作。 上图三个启用。 上图一个取消。 再次打开后&#xff0c;不报警&#xff0c;显示下图问题&#xff1a; 继续解…

直流电和交流电

直流电&#xff08;Direct Current&#xff0c;简称DC&#xff09;和交流电&#xff08;Alternating Current&#xff0c;简称AC&#xff09;是电流的两种基本形式。 1. 直流电 直流电是指电流方向始终保持不变的电流。在直流电中&#xff0c;电子只能沿着一个方向移动。直流电…

采集数据更快捷,轻松生成调查问卷二维码

现在用二维码的方式来采集用户的数据&#xff0c;是现在很常用的一种统计数据的手段&#xff0c;这种方法更加简单快捷做好数据统计&#xff0c;那么表单类型的二维码能如何快速生成呢&#xff1f;下面来教大家在线二维码生成器的使用方法&#xff0c;能够用简单的步骤快速制作…

050:vue项目webpack打包,大文件分成几个小文件的方法

第050个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

自定义类型详解(1)

文章目录 目录1. 结构体1.1 结构的基础知识1.2 结构的声明1.3 特殊的声明1.4 结构的自引用1.5 结构体变量的定义和初始化1.6 结构体内存对齐1.7 修改默认对齐数1.8 结构体传参 2. 位段2.1 什么是位段2.2 位段的内存分配2.3 位段的跨平台问题2.4 位段的应用 3. 枚举3.1 枚举类型…

虾皮选品:如何在虾皮平台上进行选品以提高销售额和利润

在虾皮&#xff08;Shopee&#xff09;平台上进行选品时&#xff0c;可以遵循以下策略和技巧&#xff0c;以便找到有潜力的产品并提高销售额。 先给大家推荐一款shopee知虾数据运营工具 知虾免费体验地址&#xff08;复制浏览器打开&#xff09;&#xff1a;d.ddqbt.com/JU5o …