C++CString 字符串拷贝

class CString {

public:

    int GetLength() const{

        return strlen(m_pData);

    }

    

    CString(const char* p);

    CString(const CString &str);  //拷贝字符串

    CString(char ch,int nRepeat); //串内有N个ch字符

    CString(const char* cstr,int nLenght); //根据字符串常量取一部分字符

    CString();

扫描二维码关注公众号,回复: 3008652 查看本文章

    ~CString();

    friend CString operator+(const CString &str1,const CString &str2);

    CString &operator=(const CString &str); //重载赋值符号只能在类成员区域;

    CString &operator=(const char *str);  //连== 赋值 ,立案等必须要有返回值,它就是用返回值去继续赋值;

    operator const char* (){return  m_pData;}

    friend std::ostream &operator<<(std::ostream &cout,CString &str);

    friend bool operator!=(const CString& str1,const CString& str2);

    friend bool operator!=(const char* str1,const CString& str2);

    friend bool operator!=(const CString& str1,const char* str2);

    friend bool operator==(const CString& str1,const CString& str2);

    friend bool operator<(const CString& str1,const CString& str2);

    friend bool operator>(const CString& str1,const CString& str2);

    friend bool operator<=(const CString& str1,const CString& str2);

    friend bool operator>=(const CString& str1,const CString& str2);

    char operator[](int nIndex) const;

    CString &operator+=(const CString& str);

    

private:

    int a;

    char* m_pData;

    

};

CString ---- CPP

#include "CString.hpp"

#include <iostream>

CString::CString(char ch,int nRepeat){

    m_pData = new char[nRepeat+1];

    memset(m_pData, ch, nRepeat);

    m_pData[nRepeat] = '\0';

}

CString::CString(const char* cstr,int nLenght){

    int nlen = strlen(cstr); //求出字符串长度

    if (nlen > nLenght)

        nlen = nLenght;

    m_pData = new char[nlen+1];

    memcpy(m_pData, cstr,nlen);

    m_pData[nlen] = '\0';

}

std::ostream &operator<<(std::ostream &out,CString &str){

    //输出的自定义输出符号

    out << str.m_pData;

    return out;

}

CString operator+(const CString &str1,const CString &str2)

{

    int n = str1.GetLength()+str2.GetLength();

    CString str;

    str.m_pData = new char[n+1];  // 这里的意思是申请所需长度的字节数然后在加一个0结束符字节 所以表示为n+1 个字节数;

    strcpy(str.m_pData, str1.m_pData);

    strcat(str.m_pData, str2.m_pData);

    

    return str;

}

CString &CString::operator=(const CString &str){

    int nLen = str.GetLength();

    //首先判断当前的字符串长度是不是大于str字符串的长度 如果说大于那就先delete在strcopy

    //再重新建立一个更长的空间

    if(GetLength() < nLen){

        

        delete []m_pData;

        m_pData = new char(nLen+1);  //根据对方的长度重新申请一个空间

        strcmp(m_pData, str.m_pData);

    }

    strcmp(m_pData, str.m_pData);

    return *this;

}

CString::CString(const char* p){

    //定一个变量记录长度

    int nLen = strlen(p);

    m_pData = new char[nLen+1];

    strcpy(m_pData, p);

}

CString::CString(const CString &str){

    

    int nLen = str.GetLength();

    //m_pData = str.m_pData; //浅拷贝这是属于;

    m_pData = new char[nLen+1]; //深拷贝

    strcpy(m_pData, str.m_pData);

    

}

CString &CString::operator=(const char *str){

    //首先获取字符串长度

    int nLen = strlen(str);

    //判断字符串长度是不是

    if (nLen > GetLength()) {

        //如果str字符串长度大于GetLenght现有的字符串长度的时候就删除现有的字符串重新分配空间

        delete []m_pData;

        m_pData = new char[nLen+1];

    }

    strcpy(m_pData, str);

    

    return *this;

}

bool operator!=(const CString& str1,const CString& str2){

    return strcmp(str1.m_pData, str2.m_pData) != 0;

}

bool operator!=(const char* str1,const CString& str2){

    return strcmp(str1, str2.m_pData) !=0;

}

bool operator!=(const CString& str1,const char* str2){

    return strcmp(str1.m_pData, str2) !=0;

}

bool operator==(const CString& str1,const CString& str2){

    

    return strcmp(str1.m_pData, str2.m_pData) == 0;

}

bool operator<(const CString& str1,const CString& str2){

    

    return strcmp(str1.m_pData, str2.m_pData) < 0;

}

bool operator>(const CString& str1,const CString& str2){

    return strcmp(str1.m_pData, str2.m_pData) > 0;

}

bool operator<=(const CString& str1,const CString& str2){

    return strcmp(str1.m_pData, str2.m_pData) <= 0;

}

bool operator>=(const CString& str1,const CString& str2){

    return strcmp(str1.m_pData, str2.m_pData) >= 0;

}

char CString::operator[](int nIndex) const{

    

    return m_pData[nIndex];

}

CString &CString::operator+=(const CString& str){

    int nLen = GetLength()+str.GetLength();

    char *p = new char[nLen+1];

    strcpy(p,m_pData);

    strcat(p, str.m_pData);

    delete []m_pData;  //删除旧的空间

    m_pData = p;

    return *this;

}

CString::CString(){

    m_pData = new char(0);  //在堆空间上申请一个字节

}

CString::~CString(){

    //删除堆空间

    delete m_pData;

}

CPP  ---- main

int main(int argc, const char * argv[]) {

    CString s1 = "abc",s2 = "-xyz";

    s1 += s2;

    std::cout << s1 << std::endl;

    return 0;

    

}

/*

int main(int argc, const char * argv[]) {

    

    CString s4("All rights reserved",8); //截断方式字符串

    CString s1 = "abc",s2 = "-xyz";

    //CString s = s1+s2;

    CString s = s1;  //深拷贝

    CString s3('*',8);

   // s1 = s2;  //直接赋值是属于浅拷贝

    CString s5;

    s5 = s4 = "123456";

    

    if (s1 == s4)

        std::cout << "相等" << std::endl;

    else

        std::cout << "不相等" << std::endl;

    if ("123456" != s4)

        std::cout << "不等" << std::endl;

    else

        std::cout << "相等" << std::endl;

    

    int i = 0;

    while (i < s.GetLength()) {

        printf("%c",s[i]);

        ++i;

    }

    

    std::cout << s1 << std::endl;

    std::cout << s2 << std::endl;

    std::cout << s << std::endl;

    std::cout << s4 << std::endl;

    

    printf("%d \n",s1.GetLength());

    printf("%d \n",s2.GetLength());

    std::cout << s.GetLength() << std::endl;

    std::cout << s3 << std::endl;

    std::cout << s4 << "\n" << s5 << std::endl;

    

    //类型转换字符串

    const char *p = s1; //C++字符串与C语言字符串;

    

    

    return 0;

}

 */

猜你喜欢

转载自blog.csdn.net/pengkejie1314520/article/details/82179786