使用C++,仿照string类,实现myString

news2024/9/23 1:25:09

类由结构体演化而来,只需要将struct改成关键字class,就定义了一个类

C++中类和结构体的区别:默认的权限不同,结构体中默认权限为public,类中默认权限为private

默认的继承方式不同,结构体的默认继承方式为public,类的默认继承方式为private

//定义格式
class 类名
{
    public:
        //功能的成员属性、函数
    protected:
        //受保护的成员属性、函数
    private:
        //私有的成员属性、函数
};

public:该权限下的成员,可以在类内、子类中和类外被访问

protected:该权限下的成员,可以在类内、子类中直接被访问,类外不允许被访问

private:该权限下的成员,只能在类内被访问,在子类、类外不允许被访问

this指针

this的内涵:是类的非静态成员函数所拥有的一个隐藏的形参指针,指代该函数本身的起始地址

哪个对象使用就表示哪个对象。

this指针的形式:类名*const this;

对于this指针而言,如果没有显性的使用该指针,仅仅是使用成员那也是默认使用了this指针。

this指针的使用场景:

场景1:当成员函数的形参名和成员变量同名时,可以使用this指针进行区分

场景2:在拷贝复制函数中,需要返回自身引用时,也必须使用this指针

类的大小

若类内没有内容,则默认占位符占一个字节。

类中的成员函数不占空间大小,但成员属性占用类的大小。

成员属性分配空间的大小遵循字节对齐原则。

如果类中有虚函数,和虚继承自父类,则会增加一个虚指针的大小。

类中特殊的成员函数(非常重要)

类中提供的特殊成员函数

特殊的原因:如果用户不显性定义这些函数,系统也会自动提供这些函数,如果用户显性定义了这些函数,那么系统就不提供了。

无论这些特殊的成员函数,是系统提供的还是用户字节定义的,都无需用户手动调用,特殊的时机,系统会自动调用

特殊成员函数:构造函数、析构函数、拷贝构造函数、拷贝复制函数、移动构造函数、移动复值函数、取地址运算符重载

构造函数:

功能:使用类去实例化对象时,为对象进行资源的申请以及初始化使用的

1、构造函数没有返回值

2、函数名与类同名

3、访问权限public

4、 取名方式:类名(形参列表)        {函数体内容}

 //自定义有参构造
    Stu(string n, int a)
    {
        this->name = n;
        this->age = a;
        cout<<"Stu::有参构造"<<endl;
    }


 Stu s2("zhangsan", 18);          //此时调用了有参构造

析构函数

功能:在对象消亡时,用于给对象回收空间使用的

1、没有返回值

2、函数名:~类名

3、权限:一般为public

4、没有参数,所以一个类中只有一个析构函数,不能进行重载

4、命名格式: ~类名()

调用时机:当对象的生命周期结束后,用于回收内存空间

栈区:当栈空间释放后,系统会自动调用该类的析构函数

堆区:当使用delete关键字释放对象空间时,系统自动调用

//定义析构函数
    ~Stu()
    {
        delete ptr;          //释放指针的空间
        cout<<"STU::析构函数"<<endl;
    }
 //堆区空间申请对象
    Stu *ptr;          //此时不调用构造函数
    ptr = new Stu;      //此时调用构造函数

    delete ptr;       //此时会调用析构函数

仿照string类,实现myString

程序函数:

#include <iostream>
#include "myString.h"
using namespace std;

// 无参构造
myString::myString() : size(10)
{
    str = new char[size + 1]; // 确保有空字符终止
    str[0] = '\0'; // 初始化为空字符串
}

// 有参构造
myString::myString(const char *s)
{
    size = strlen(s); // 获取字符串长度
    str = new char[size + 1]; // 确保有空字符终止
    strcpy(str, s); // 将s复制给str
}

// 析构函数
myString::~myString()
{
    delete[] str;
}

// 判空函数
bool myString::my_Empty()
{
    return size == 0;
}

// size函数
int myString::My_Size()
{
    return size;
}

// c_str函数
char *myString::My_c_str()
{
    return str;
}

// at函数
char myString::at(int index)
{
    if (index >= 0 && index < size)
    {
        return str[index];
    }
    else
    {
        cout << "超出范围" << endl;
        exit(1); // 终止程序
    }
}

// 二倍扩容
void myString::doubleCapacity()
{
    char *newStr = new char[size * 2 + 1];
    strcpy(newStr, str);
    delete[] str;
    str = newStr;
    size *= 2;
}

头文件:
 

#ifndef MYSTRING_H
#define MYSTRING_H

#include <cstring>

class myString
{
private:
    char *str; // 记录C风格的字符串
    int size;  // 记录字符串的实际长度

public:
    // 无参构造
    myString();

    // 有参构造
    myString(const char *s);

    // 析构函数
    ~myString();

    // 判空函数
    bool my_Empty();

    // size函数
    int My_Size();

    // c_str函数
    char *My_c_str();

    // at函数
    char at(int index);

    // 二倍扩容
    void doubleCapacity();
};

#endif // MYSTRING_H

主函数:

#include <iostream>
using namespace std;
#include "myString.h"

int main()
{
    myString s1("hello world");
    cout << s1.My_Size() <<endl; // 输出: 11
    cout << s1.My_c_str() << endl; // 输出: hello world
    cout << s1.at(6) << endl; // 输出: w
    s1.~myString();//调用析构函数
    return 0;
}

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

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

相关文章

LLM的发展简述

文章目录 1. NLP的发展简史2. LLM 的进展3. 参考 1. NLP的发展简史 信息理论的创立&#xff1a;20世纪50年代&#xff0c;Claude Shannon 奠定了信息理论的基础&#xff0c;引入了熵和冗余等概念&#xff0c;对 NLP 和计算语言学产生了深远影响。 形式语法的发展&#xff1a;…

代码随想录(day8)—环形链表

题目 预备知识点&#xff1a; for和while的区别 while语句属于循环语句&#xff0c;在判断是&#xff0c;如果条件为true&#xff0c;则会继续判断&#xff0c;直到false为止&#xff0c;即会进行多次判断&#xff08;除非一开始条件就是错的&#xff09;。 if语句属于条件判…

炫光HUD杂散光测试方法及设备

HUD杂散光测试概述 HUD&#xff08;Heads-Up Display&#xff09;抬头显示器是现代汽车中的一项先进技术&#xff0c;它可以将重要信息如速度、导航等投射在驾驶员的视线前方&#xff0c;从而减少低头查看仪表盘的次数&#xff0c;提高行车安全。然而&#xff0c;HUD在实际使用…

数据主权与隐私保护的深入探讨

随着数字化进程的加速&#xff0c;数据已成为当今世界的重要资源。数据主权和隐私保护这两个概念也越来越受到关注。数据主权涉及到国家对数据的控制权和管理权&#xff0c;而隐私保护则关乎个人数据的安全性和隐私权利。两者相互交织&#xff0c;共同塑造了数字时代的法律、经…

PTA - python暑假题集1

目录 7-1 Hello World!7-2 计算摄氏温度7-3 计算物体自由下落的距离7-4 整数四则运算7-5 求整数均值7-6 输出带框文字7-7 整数152的各位数字7-8 计算火车运行时间7-9 计算存款利息7-10 逆序的三位数7-11 重要的话说三遍7-12 后天7-13 I Love GPLT7-14 是不是太胖了7-15 计算指数…

day44——C++对C的扩充

八、C对函数的扩充 8.1 函数重载&#xff08;overload&#xff09; 1> 概念 函数重载就是能够实现"一名多用"&#xff0c;是实现泛型编程的一种 泛型编程&#xff1a;试图以不变的代码&#xff0c;来实现可变的功能 2> 引入背景 程序员在写函数时&#x…

某系统存在任意文件下载漏洞

穷者&#xff0c;谁不想达&#xff0c;达者&#xff0c;更畏惧穷。为求发达&#xff0c;穷人兢兢业业&#xff0c;辛辛苦苦&#xff0c;农耕其田&#xff0c;工利其器&#xff0c;商务其业&#xff0c;学读其书&#xff0c;人人都在独善其身&#xff0c;可除了那些少数的书生可…

VS2022打包Docker镜像

1. 前置环境 操作系统win10/win11 安装 Docker Desktop 2. 演示项目 https://gitee.com/izory/ZrAdminNetCore .net8 分支为例 3. 添加 docker支持 4. 配置工程文件 在.proj 文件加上 <ContainerRepository>ZrAdminCore</ContainerRepository> <Containe…

【C++ 面试 - 内存管理】每日 3 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

视频压缩工具哪个好?视频压缩工具安利

还在为视频文件过大而烦恼吗&#xff1f;想要快速分享或上传视频却受限于空间或时间&#xff1f; 别担心&#xff0c;今天我来告诉你们&#xff1a;视频压缩成文件怎么弄。 无需复杂操作&#xff0c;轻松几步&#xff0c;就能让你的视频文件瘦身成功&#xff0c;既保留关键内…

深度学习基础—结构化机器学习项目

1.正交化 这是一个老式电视&#xff0c;有一组旋钮可以对画面进行调节&#xff0c;例如高度、宽度、画面梯形角度、画面位置、画面旋转等等&#xff0c;但是如果有一个旋钮&#xff0c;旋转时可以调节上面所有参数&#xff0c;那么就会出现一种情况&#xff1a;当前的画面高度和…

jconsole远程连接

jconsole可以远程连接的前提&#xff08;需要在部署应用时像下面示例这样设置&#xff09;&#xff1a; -Djava.rmi.server.hostname127.0.0.1 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port3214 -Dcom.sun.management.jmxremote.sslfalse -Dcom.sun.m…

milvus使用milvus migration工具迁移数据

1.前提&#xff1a;这个数据迁移工具是collection 维度的 2.文章内是2.3.1–》2.4.5数据迁移&#xff0c;公司内部需求&#xff0c;各位看官注意哈 官方架构图&#xff1a; 想要迁移的milvus 官方称之为&#xff1a;源source milvus 要迁入的表 目标的milvus 官方称之为&…

JWT结构详解与JWT设置

JWT结构详解与JWT设置 1. 什么是token2. 为什么要使用token3. 什么是JWT4. JWT的格式4.1 header4.2 payload4.3 signature 5. JWT校验流程6. JWT使用案例6.1 token的创建6.2 判断token是否可以刷新6.3 刷新token6.4 token的校验6.5 用户验证流程 1. 什么是token Token是服务端…

Prometheus+Grafana的安装和入门

概念 什么是Prometheus? Prometheus受启发于Google的Brogmon监控系统&#xff08;相似kubernetes是从Brog系统演变而来&#xff09;&#xff0c; 从 2012年开始由google工程师Soundclouds使用Go语言开发的开源监控报警系统和时序列数据库 (TSDB)。&#xff0c;并且与2015年早…

2017年系统架构师案例分析试题一

目录 案例 【题目】 【问题 1】(12 分) 【问题 2】(13 分) 答案 【问题 1】答案 【问题 2】答案 相关推荐 案例 阅读以下关于软件架构评估的叙述&#xff0c;在答题纸上回答问题 1 和问题 2。 【题目】 某单位为了建设健全的公路桥梁养护管理档案&#xff0c;拟开发一套公…

USB PHY—— PHY 基础

芯片厂商开发了一些 USB PHY 芯片&#xff0c;可以把 DP、DM上的差模信号转成共模信号。 USB PHY 负责最底层的信号转换&#xff0c;作用类似于网口的 PHY。 USB 信号传输前&#xff0c;需要通过 PHY 把 USB 控制器的数字信号转成线缆上的模拟信号。USB 控制器和 PHY 之间的总…

中国严肃游戏开发的最佳实践

严肃游戏产业在中国迅速发展&#xff0c;将娱乐与教育、培训和宣传活动融为一体。旨在实现特定学习成果或行为改变的严肃游戏在从企业培训到医疗保健和教育的各个领域越来越受欢迎。然而&#xff0c;为中国市场开发成功的严肃游戏需要深入了解当地文化、用户偏好和技术趋势。以…

函数栈帧的创建和销毁(VS2022)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、前面的困惑 二、什么是函数栈帧 三、关于函数栈帧的基础知识 1.栈 2.寄存器 2.1 什么是寄存器 2.2 相关的寄存器 2.3 相关汇编命令 2.4 预备知识 四、解析函数…

盘点4款可以免费使用的高效ai PPT制作工具。

平时我们自己制作一个PPT还是需要比较长的时间的&#xff0c;从构思内容&#xff0c;到制作主题和逻辑框架&#xff0c;然后是挑选模板、排版配色等&#xff0c;过程比较繁琐且费时。但是&#xff0c;现在出现了很多的AIPPT制作工具&#xff0c;能够快速的帮助用户生成一个完整…