栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 自定义MyString类 及 深拷贝

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 自定义MyString类 及 深拷贝

文章目录
  • 深拷贝
  • MyString.hpp
  • MyString.cpp
  • main.c

深拷贝

带有指针的类,必须有 拷贝构造和拷贝赋值构造函数。

MyString.hpp
#include 

//带有指针的类 必须有 拷贝构造(copy) 和 拷贝赋值(op=)

class myString
{
public:
    myString(const char* cstr = nullptr);
    myString(const myString& str); //拷贝构造(带有指针的深拷贝,浅拷贝,调用默认的拷贝构造,会出现内存泄漏)
    myString& operator=(const myString &);
    ~ myString();

    char* get_c_char()const{return m_data;};//inline function


private:
    int m_len;
    char *m_data;
};
MyString.cpp
#include 
#include 

#include "myString.hpp"

using namespace std;
//普通的构造函数
myString::myString(const char* cstr)
{
    cout << "normal construct" << endl;
    if(cstr!=nullptr)
    {
        m_len = strlen(cstr);
        m_data = new char[m_len + 1]{0};    //分配内存
        strncpy_s(m_data, sizeof(m_data), cstr, m_len);     //拷贝字符串
        cout<< m_data << endl;
    }
    else //空字符串
    {
        m_data = new char[1];                   //只分配一个字符空间,用来存储''
        *m_data = '';
    }
}

myString::~myString()
{
    cout << "De-constructer called" << endl;
    delete[] m_data;
    m_data = nullptr;
}

//拷贝构造函数

myString::myString(const myString& str)         
{
    cout << "copy construct called" << endl;
    //deep copy  
    m_len = strlen(str.m_data);
    m_data = new char[m_len+1]{0};  //here must initialize the m_data
    strncpy_s(m_data, sizeof(m_data), str.m_data, m_len);     //拷贝字符串
    cout << m_data << endl;
}


myString& myString::operator=(const myString& str)
{   
    //赋值的过程:
    //1 销毁自己
    //2 重分配空间 
    //3 返回*this   
    //检测自我赋值
    cout << "operator= construct called" << endl;
    if(this == &str)
    {
        return *this;
    }
    
    delete[] m_data;
    m_data = new char[strlen(str.m_data)+1]{0};
    strncpy_s(m_data, sizeof(m_data),  str.m_data, strlen(str.m_data));
    return *this;
}

main.c
#include 
#include "myString.hpp"

int main()
{
    std::cout<< "hello" <
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867174.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号