当前位置: 首页 > news >正文

【C++初阶】string类

【C++初阶】string类

🥕个人主页:开敲🍉

🔥所属专栏:C++🥭

🌼文章目录🌼

1. 为什么学习string类?

    1.1 C语言中的字符串

    1.2 实际中

2. 标准库中的string类

    2.1 string类

    2.2 auto和范围for

    2.3 string类常用接口说明

3. string类的模拟实现

    3.1 经典的string类问题

        3.1.1 浅拷贝

       3.2.2 深拷贝

    3.2 string类模拟实现

1. 为什么学习string类?
    1.1 C语言中的字符串

  C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列
的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户
自己管理,稍不留神可能还会越界访问。

    1.2 实际中

  在我们日常的刷题中,有关字符串的题目基本上是以string的形式出现的,并且在日常的生活当中,为了简单、方便快捷,基本上也都是使用的string,很少有人使用C标准库中的字符串操作函数。

2. 标准库中的string类
    2.1 string类

  string - C++ Reference (cplusplus.com)

  这里面有关于string类的详细说明,包括它的每个接口的功能以及接口的使用环境等。其中比较重要的接口有:operator=、iterators有关的begin、end的所有接口(自己实现时子需要实现begin、end即可,后面的rbegin和rend等理解即可)、size、resize、capacity、reserve、clear、empty、operator[]、operator+=、append、push_back、insert、erase、swap、c_str、find、find_first_of

    2.2 auto和范围for

auto关键字:

  在这里补充两个C++11的小语法,方便我们后面的学习

  ① 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型
指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期
推导而得,
也就是说,auto能够自动识别对象的类型

   用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&

   当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

  auto不能作为函数的参数,可以作为返回值,但是建议谨慎使用

  auto不能直接用来声明数组

  看到这里你可能觉得auto没什么作用,我知道我想要的是什么类型的我为什么还要它自动识别。别着急,后面你就会明白auto是有多好用。

范围for:

   对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。

for(auto+变量 : 迭代范围)

{

        //循环体
}

  ② 范围for可以作用到数组和容器对象上进行遍历

  范围for看似非常智能很厉害,实际上底层就是迭代器(迭代器是什么后面会讲,此处记住即可)

    2.3 string类常用接口说明

1. string的常见构造函数:

2. string类对象的容量(Capacity)操作:

size(重点):返回字符串有效字符长度

length:返回字符串有效字符长度

capacity:返回所开空间总大小

empty(重点):检查字符串是否为空

clear(重点):仅删除数据,而不销毁空间

reserve(重点):为字符串预留一块空间,可以数据量小时可以省去开辟空间的消耗

rsize(重点):将有效的字符减为n(自己传)个,如果是增加,则多加的字符改为c(自己传)

注:

   size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接
口保持一致,一般情况下基本都是用size()。

   clear()只是将string中有效字符清空,不改变底层空间大小。

   resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不
同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char
c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数
增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

  ④ reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参
数小于string的底层空间总大小时,reserver不会改变容量大小(Linux环境下会改变,但不会影响数据的存储)。

3. string类对象的访问及遍历操作:

operator[](重点):返回pos位置字符的引用(方便修改),const string类调用

begin+end(重点):begin获取字符串开头第一个字符的迭代器+end获取最后一个字符下一个位置的迭代器

//后面还有rbegin+rend、crbegin+crend、cbegin+cend等迭代器,这里不一一赘述

4. string类对象的修改操作:

push_back(重点):在字符串后尾插一个字符

append(重点):在字符串后尾插一个字符串

operator+=(重点):重载+=运算符,可以完成尾插操作

c_str(重点):返回字符串地址

find+npos(重点):从字符串pos位置开始往后查找所要字符,并返回其所在位置。如果遍历完字符串也找不到,则返回npos

rfind:从字符串pos位置开始往前查找所要字符,并返回其所在位置。如果找不到,则返回npos

substr:从字符串pos位置开始截取n个字符并返回

注:

  ① 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差
不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可
以连接字符串。

  ② 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留
好,这样可以节剩开辟空间的效率消耗。

5. string类非成员函数

operator+:尽量少用,因为传值返回,导致深拷贝,导致效率降低

operator<<(重点):输入运算符重载,用于方便输出string字符串中的内容

operator>>(重点):输入运算符重载

getline(重点):获取一行字符串,遇到'\0'才会停止获取,在OJ的字符串题中很常用

relational operators(重点):大小比较,重载了各种类型的比较运算符

3. string类的模拟实现
    3.1 经典的string类问题
        3.1.1 浅拷贝

  浅拷贝:也称位拷贝,编译器只是将对象中的拷贝过来。如果对象中管理资源,最后就会导致
多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该
资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。

  例如:一个家庭中有两个孩子,但父母只买了一份玩具,两个孩子愿意一块玩,则万事大吉,万一不想分享就你争我夺,玩具损坏。

       3.2.2 深拷贝

  如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给
出。一般情况都是按照深拷贝方式提供。

    3.2 string类模拟实现

//string.h头文件的声明

#pragma once


#include <iostream>
#include <assert.h>
using namespace std;


namespace gjk
{
    class string
    {
    public:

        typedef char* iterator;


        string(const char* s = "")
        {
            _str = new char[strlen(s) + 1];
            strcpy(_str, s);
            _size = strlen(s);
            _capacity = _size;
        }

        char& operator[](size_t pos)
        {
            assert(pos < _size);
            return _str[pos];
        }

        const char& operator[](size_t pos) const
        {
            assert(pos < _size);
            return _str[pos];
        }

        size_t size()
        {
            return _size;
        }

        const size_t size() const
        {
            return _size;
        }

        size_t capacity()
        {
            return _capacity;
        }

        const size_t capacity() const
        {
            return _capacity;
        }

        
        char* c_str()
        {
            return _str;
        }

        //迭代器
        iterator begin()
        {
            return _str;
        }

        const iterator begin() const
        {
            return _str;
        }

        iterator end()
        {
            return _str + _size;
        }

        const iterator end() const
        {
            return _str + _size;
        }

        ~string()
        {
            delete[] _str;
            _str = nullptr;
            _size = _capacity = 0;
        }

        //扩容
        void dilatancy(int newcapacity);
        //预留空间
        void reserve(size_t n);
        //改变有效字符数
        void rsize(size_t n, char ch = '\0');
        //尾插
        void push_back(char ch);
        //尾插字符串
        void append(const char* s);
        //指定插入字符
        void insert(size_t pos, char ch);
        //指定删除n字符
        void erase(size_t pos,size_t n = npos);
        //指定插入字符串
        void insert(size_t pos, const char* s);
        //清除数据
        void clear();
        //判空
        bool empty();

        //+=一个字符运算符重载
        string& operator+=(char ch);
        //+=字符串运算符重载
        string& operator+=(const char* s);


        //比较运算符重载
        bool operator==(const string& s);

        bool operator>(const string& s);

        bool operator<(const string& s);

        bool operator>=(const string& s);

        bool operator<=(const string& s);

        bool operator!=(const string& s);


        //找到字符第一次出现的位置
        int find(char ch,size_t pos = 0);

        //找到字符串第一次出现的位置
        int find(const char* s, size_t pos = 0);

    private:
        char* _str;
        size_t _size;
        size_t _capacity;

        const static size_t npos   = -1;
    };
}

//string.cpp文件的定义

#define _CRT_SECURE_NO_WARNINGS 1


#include "string.h"


namespace gjk
{
    //扩容
    void string::dilatancy(int newcapacity)
    {
        char* tmp = new char[newcapacity + 1];
        strcpy(tmp, _str);
        delete[] _str;
        _str = tmp;
        _capacity = newcapacity;
    }


    //预留空间
    void string::reserve(size_t n)
    {
        if (n > _capacity)
        {
            char* tmp = new char[n + 1];
            strcpy(tmp, _str);
            delete[] _str;
            _str = tmp;
            _capacity = n;
        }
    }

    //改变有效字符数
    void string::rsize(size_t n, char ch)
    {
        if (n <= _size)
        {
            _size = n;
            _str[_size] = '\0';
        }
        else
        {
            while (_size != n)
            {
                if (_size == _capacity)
                    dilatancy(_capacity == 0 ? 4 : 2 * _capacity);
                _str[_size++] = ch;
            }
            _str[_size] = '\0';
        }
    }

    //尾插
    void string::push_back(char ch)
    {
        if (_size == _capacity)
            dilatancy(_capacity == 0 ? 4 : 2 * _capacity);
        _str[_size++] = ch;
        _str[_size] = '\0';
    }


    //尾插字符串
    void string::append(const char* s)
    {
        int len = strlen(s);
        if (_size + strlen(s) > _capacity)
            dilatancy(_size + len > 2 * _capacity ? _size + len : 2 * _capacity);
        strcpy(_str + _size, s);
        _size += len;
    }


    //指定插入字符
    void string::insert(size_t pos, char ch)
    {
        assert(pos <= _size);
        if (_size == _capacity)
            dilatancy(_capacity == 0 ? 4 : 2 * _capacity);
        size_t end = _size + 1;
        while (end > pos)
        {
            _str[end] = _str[end - 1];
            end--;
        }
        _str[pos] = ch;
        _size++;
    }


    //指定删除n个字符
    void string::erase(size_t pos,size_t n)
    {
        assert(pos < _size);
        if (n >= _size - pos||n == npos)
        {
            _str[pos] = '\0';
            _size -= (_size - pos);
        }
        else
        {
            size_t end = pos + n;
            while (end <= _size)
            {
                _str[pos++] = _str[end++];
            }
            _size -= n;
        }
    }

    //指定插入字符串
    void string::insert(size_t pos, const char* s)
    {
        assert(pos <= _size);
        int len = strlen(s);
        if (_size + strlen(s) > _capacity)
            dilatancy(_size + len > 2 * _capacity ? _size + len : 2 * _capacity);
        size_t end = _size + len + 1;
        while (end - len > pos)
        {
            _str[end] = _str[end - len - 1];
            end--;
        }
        memcpy(_str + pos, s, len);
        _size += len;
    }


    //清除数据
    void string::clear()
    {
        _str[0] = '\0';
        _size = 0;
    }


    //判空
    bool string::empty()
    {
        return _size == 0;
    }


    //+=一个字符运算符重载
    string& string::operator+=(char ch)
    {
        push_back(ch);
        return *this;
    }


    //+=字符串运算符重载
    string& string::operator+=(const char* s)
    {
        append(s);
        return *this;
    }


    //比较运算符重载
    bool string::operator==(const string& s)
    {
        return strcmp(_str, s._str) == 0;
    }

    bool string::operator>(const string& s)
    {
        return strcmp(_str, s._str) > 0;
    }


    bool string::operator<(const string& s)
    {
        return !(*this == s || *this > s);
    }


    bool string::operator>=(const string& s)
    {
        return !(*this < s);
    }


    bool string::operator<=(const string& s)
    {
        return !(*this > s);
    }


    bool string::operator!=(const string& s)
    {
        return !(*this == s);
    }

    //找到字符第一次出现的位置
    int string::find(char ch,size_t pos)
    {
        assert(pos < _size);
        while (_str[pos] != ch && pos < _size)
        {
            pos++;
        }
        if (pos == _size)
            return -1;
        return pos;
    }


    //找到字符串第一次出现的位置
    int string::find(const char* s, size_t pos)
    {
        assert(pos < _size);
        int len = strlen(s);
        while (_str[pos] != s[0] && pos < _size)
        {
            pos++;
        }
        if (pos == _size||_size-pos < len)
            return -1;
        int ret = memcmp(_str + pos, s, len);
        if (!ret)
            return pos;
        return -1;
    }
}

   

                                                 创作不易,点个赞呗,蟹蟹啦~             

相关文章:

【C++初阶】string类

【C初阶】string类 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 实际中 2. 标准库中的string类 2.1 string类 2.…...

RAS--APEI 报错解析流程(2)

RAS--APEI 报错解析流程(1) 除了APEI 中除了GHES会记录错误&#xff0c;在Post过程中的错误通常是通过BERT Table汇报 1.BERT Boot Error Record Table is used to report unhandled errors that occurred in a previous boot&#xff0c;it is reported as a ‘one-time polle…...

微软蓝屏事件对企业数字化转型有什么影响?

引言&#xff1a;从北京时间2024年7月19日&#xff08;周五&#xff09;下午2点多开始&#xff0c;全球大量Windows用户出现电脑崩溃、蓝屏死机、无法重启等情况。事发后&#xff0c;网络安全公司CrowdStrike称&#xff0c;收到大量关于Windows电脑出现蓝屏报告&#xff0c;公司…...

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)

【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(上) 大家好 我是寸铁&#x1f44a; 【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(上)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分&…...

浅谈Devops

1.什么是Devops DevopsDev&#xff08;Development&#xff09;Ops&#xff08;Operation&#xff09; DevOps&#xff08;Development和Operations的混合词&#xff09;是一种重视“软件开发人员&#xff08;Dev&#xff09;”和“IT运维技术人员&#xff08;Ops&#xff09;”…...

大文件分片上传(前端TS实现)

大文件分片上传 内容 一般情况下&#xff0c;前端上传文件就是new FormData,然后把文件 append 进去&#xff0c;然后post发送给后端就完事了&#xff0c;但是文件越大&#xff0c;上传的文件也就越长&#xff0c;如果在上传过程中&#xff0c;突然网络故障&#xff0c;又或者…...

unity2D游戏开发02添加组件移动玩家

添加组件 给PlayGame和EnemyObject添加组件BoxCollider 2D碰撞器&#xff0c;不用修改参数 给PlayGame添加组件Rigibody 2D 设置数据 添加EnemyObject&#xff0c;属性如下 Edit->project setting->Physics 2D 将 y的值改为0 给playerObject添加标签 新建层 将PlayerObj…...

设计模式 之 —— 单例模式

目录 什么是单例模式&#xff1f; 定义 单例模式的主要特点 单例模式的几种设计模式 1.懒汉式&#xff1a;线程不安全 2.懒汉式&#xff1a;线程安全 3.饿汉式 4.双重校验锁 单例模式的优缺点 优点&#xff1a; 缺点&#xff1a; 适用场景&#xff1a; 什么是单例模…...

深入浅出WebRTC—ULPFEC

FEC 通过在发送端添加额外的冗余信息&#xff0c;使接收端即使在部分数据包丢失的情况下也能恢复原始数据&#xff0c;从而减轻网络丢包的影响。在 WebRTC 中&#xff0c;FEC 主要有两种实现方式&#xff1a;ULPFEC 和 FlexFEC&#xff0c;FlexFEC 是 ULPFEC 的扩展和升级&…...

Python从0到100(四十三):数据库与Django ORM 精讲

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...

Redis-主从模式

目录 前言 一.主从节点介绍 二.配置redis主从结构 二.主从复制 四.拓扑结构 五.数据同步 全量复制&#xff08;Full Sync Replication&#xff09; 局部复制&#xff08;Partial Replication&#xff09; Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 前言 …...

加速决策过程:企业级爬虫平台的实时数据分析

摘要 在当今数据驱动的商业环境中&#xff0c;企业如何才能在海量信息中迅速做出精准决策&#xff1f;本文将探讨企业级爬虫平台如何通过实时数据分析加速决策过程&#xff0c;实现数据到决策的无缝衔接。我们聚焦于技术如何赋能企业&#xff0c;提升数据处理效率&#xff0c;…...

字典树(前缀树)数组实现(只能查26个单词)

这段代码实现了一个基于 Trie 树的字典树&#xff08;Trie&#xff09;数据结构&#xff0c;用于存储和检索字符串。其中包含以下几个方法. insert(String word): 向 Trie 树中插入一个单词。首先将单词转换为字符数组&#xff0c;然后遍历字符数组&#xff0c;逐个字符在 Trie…...

CTF-pwn-虚拟化-vmmware 前置

文章目录 参考vmware逃逸简介虚拟机和主机通信机制(guest to host)共享内存&#xff08;弃用&#xff09;backdoor机制Message_Send和Message_RecvGuestRPC实例RpcOutSendOneRawWork实例 vmware-rpctool info-get guestinfo.ip各个步骤对应的backdoor操作Open RPC channelSend …...

thinkphp8结合layui2.9 图片上传验证

<?php declare (strict_types 1);namespace app\index\validate;use think\Validate;class Upload extends Validate {/*** 定义验证规则* 格式&#xff1a;字段名 > [规则1,规则2...]** var array*/protected $rule [image > fileExt:jpg,png|fileSize:204800|fi…...

农村污水处理难题:探索低成本高效解决方案

农村污水处理难题&#xff1a;探索低成本高效解决方案 农村污水处理作为国家生态文明建设的重要一环&#xff0c;面临着诸多挑战&#xff0c;尤其是技术落后、管理分散、资源匮乏等问题。物联网技术的引入&#xff0c;为解决这些痛点提供了创新途径&#xff0c;实现了对污水处…...

lightningcss介绍及使用

lightningcss介绍及使用 一款使用 rust 编写的 css 解析器&#xff0c;转换器、及压缩器。 特性 特别快&#xff1a;可以在毫秒级别解析、压缩大量的 css 文件&#xff0c;而且比其他工具的打包结果更小给值添加类型&#xff1a;许多其他css解析器会将值解析成一个无类型的 …...

HTTP服务的应用

1、编辑json请求参数&#xff1b; 2、把json发送到服务url&#xff0c;接收服务的返回参数&#xff1b; 3、解析返回参数。 procedure TfrmCustomQuery.btnFullUpdateClick(Sender: TObject); varfrm: TfrmInputQueryConditionEX;b_OK: Boolean;sBeginDate, sEndDate, sJSON…...

uni-app:踩坑路---scroll-view内使用fixed定位,无效的问题

前言&#xff1a; emmm&#xff0c;说起来这个问题整得还挺好笑的&#xff0c;本人在公司内&#xff0c;奋笔疾书写代码&#xff0c;愉快的提交测试的时候&#xff0c;测试跟我说&#xff0c;在苹果手机上你这个样式有bug&#xff0c;我倒是要看看&#xff0c;是什么bug。 安卓…...

MySQL4.索引及视图

1.建库 create database mydb15_indexstu; use mydb15_indexstu;2.建表 2.1 student表学&#xff08;sno&#xff09;号为主键&#xff0c;姓名&#xff08;sname&#xff09;不能重名&#xff0c;性别&#xff08;ssex&#xff09;仅能输入男或女&#xff0c;默认所在系别&a…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...