手把手教你实现一个简单的string类

手把手教你实现一个简单的string类

步骤

1.simpleString实现的功能:

  • 初始化
  • 拷贝构造
  • 拷贝赋值
  • 析构
  • 获得首地址指针

2.查看对应的simpleString.cpp的代码和注释进行理解,
代码链接:https://github.com/Wangleizhenshuai/simple_string
代码如下:

#include<iostream>
#include <string.h> 
//该字符串头文件是c的文件,c++ 的字符串头文件是#include<string>
 
class simpleString
{
private:
    char * m_data;//string 的大小由用户指定,所以采用指针 根据具体大小进行创建
public:
    //类的定义遵从 类内定义成员函数 类外具体化 规则
    //所有的构造和析构函数没有返回值 

    simpleString(const char* c_str = 0); //- 初始化 
    //simpleString:构造函数应该和class 同名
    //const:不改变传进来对象
    //char*:希望传进来的是指向char的指针,可以用户自定义
    //c_str = 0 :如果用户不赋值,默认为0;

    simpleString(const simpleString & a); //- 拷贝构造  
    //const simpleString:因为是拷贝和自己一样的类型,所以用simpleString
    // &;使用引用传值减少内存开销 
    // a:拷贝的simpleString对象
    
    simpleString& simpleString::operator=(const simpleString & a); //- 拷贝赋值 
    //simpleString&:返回的是赋值完成的对象的引用
    //operator=:操作符= 的重载
    
    ~simpleString();//- 析构 在对像调用完对其所在的内存进行释放 ,调用free函数

    char* get_c_char() {//- 获得首地址指针 方便对simpleString对象进行操作
        return m_data;
    }; 
    
};
//类外进行函数具体定义
inline //内联函数,与恒定义作用类似,在编译器编译的过程中将函数替换掉
        //一般短小函数都进行内联,但是该函数只是给编译器提供建议,具体还是要靠编译器进行识别,所以可以放心加
simpleString::simpleString(const char* c_str = 0)//- 初始化
{
    // 考虑分配多少空间放初值
    if (c_str) { //如果c_str不是0 进行分配空间
        m_data = new char[strlen(c_str) + 1];
        //new: 使用new来调用malloc分配空间 注意new和delete需要成对使用 防止内存泄漏
        //char[]:字符串的本质是char数组 
        //c_str:该指针指向字符串首地址
        //strlen(c_str): 从字符串的开头位置依次向后计数,直到遇见'\0',然后返回计时器的值。最终统计的字符串长度不包括'\0'
        //+ 1: 字符串以'\0'为结尾,但是统计长度并不统计'\0',所以要加1
        //m_data =:将本身的指针指向新开辟的内存字符数组空间的首地址,方便后续对内存空间进行操作
        strcpy(m_data,c_str);
        //strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest指针   
    } else { // 如果c_str为0
        m_data = new char[1]; //只分配长度为1的内存空间
        *m_data = '\0';
        //*m_data:取m_data指针所指向的地址
        //'\0':赋值为空字符串
    }
  
}
inline
simpleString::simpleString(const simpleString & a)//- 拷贝构造
{
    m_data = new char[strlen(a.m_data) + 1];//分配内存空间
    strcpy(m_data, a.m_data);//同上
    
}

inline
simpleString & simpleString::operator=(const simpleString & a){//- 拷贝赋值
    //simpleString &:返回的是simpleString的引用
    //先判断是不是自我赋值 自我赋值不仅仅是多做一遍 而是会先把自己删掉出现错误 
    if (this == &a) {
        return *this;
    }

    delete[] m_data;//先把自己删掉
 
    m_data = new char[strlen(a.m_data) + 1];//分配内存空间s
    strcpy(m_data, a.m_data);//同上
    return *this; // 传出去的类型 不需要关注函数怎么接受 所以可以返回指针。

} 

simpleString::~simpleString()//正常函数 不需要重写 析构函数 当使用New的时候 需要 搭配delete
{
    delete[] m_data; // new了数组,所以需要 delete 数组  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值