MyString

//
// Created by yudw on 2017/8/6.
//

#ifndef MYFISTAPP_MYSTRING_H
#define MYFISTAPP_MYSTRING_H

#include <cstring>

namespace yudw
{
    class MyString
    {
    public:
        MyString(const char *data = nullptr);   // 构造
        MyString(const MyString &rhs);  // 拷贝构造
        MyString(MyString&& rhs) noexcept;   // 移动构造
        MyString& operator = (const MyString &rhs); // 赋值构造
        MyString& operator = (MyString&& rhs) noexcept; // 移动赋值
        ~MyString();    // 析构

        size_t size() const;    // 获取sieze
        const char* c_str() const;

    private:
        char* data_;
    };


    // 构造
    MyString::MyString(const char *data)
    {
        if(data == nullptr)
        {
            data_ = new char[1];
            data_[0] = '\0';
        }
        else
        {
            data_ = new char[strlen(data) + 1];
            strcpy(data_, data);    // strcpy 里已经把\0赋值
        }
    }

    // 拷贝构造
    MyString::MyString(const MyString &rhs)
    {
        data_ = new char[strlen(rhs.data_) + 1];
        strcpy(data_, rhs.data_);

    }

    // 移动构造 std::move
    MyString::MyString(MyString &&rhs) noexcept
    {
        data_ = rhs.data_;
        rhs.data_ = nullptr;
    }

    // 赋值构造函数
    MyString& MyString::operator=(const MyString &rhs)
    {
        if(this == &rhs)
        {
            return *this;
        }
        MyString temp(rhs);
        std::swap(data_, rhs.data_);
        return *this;
    }


    // c++ primer 的一种写法, c++ 11的写法(推荐写法)
    MyString& MyString::operator=(MyString rhs)
    {
        std::swap(data_, rhs.data_);
        return *this;
    }

    // 移动赋值
    MyString& MyString::operator=(MyString &&rhs)
    {
        if(this != &rhs)
        {
            delete [] data_;    // 释放原有空间
            data_ = rhs.data_;  // 赋值
            rhs.data_ = nullptr;   // 清空
        }
        return *this;
    }
    // 析构函数
    MyString::~MyString()
    {
        delete[] data_;
        // delete data_;
    }

    // 获取size
    size_t MyString::size() const
    {
        return strlen(data_);
    }

    // 获取c_str
    const char* MyString::c_str() const
    {
        return data_;
    }

}


#endif //MYFISTAPP_MYSTRING_H
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值