C++设计CTString类

简介:
#include <iostream>
using namespace std;

#include "CTString.h"

int main()
{
    CTString *pStr = new CTString("I love you!");

    cout << pStr->Size() << endl;
    cout << pStr->Empty() << endl;
    pStr->Print();

    pStr->Copy("Hello");
    pStr->Print();

    pStr->Connect("World");
    pStr->Print();

    CTString str("HEHE");
    str.Print();

    pStr->Copy(&str);
    pStr->Print();

    CTString str1(10, 'I');
    str1.Print();

    CTString str2(str1);
    str2.Print();

    CTString str3(*pStr);
    str3.Print();

    CTString str4("E");
    cout << "str3.Find(&str4)=" << str3.Find(&str4) << endl;
    cout << "str3.Find(str4)=" << str3.Find(str4) << endl;
    cout << "str4.Find('E') = " << str4.Find('E') << endl;

    cout << "对象个数" << CTString::getCount() << endl;

    delete pStr;
    system("pause");
    return 0;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//*****************CTString类的声明开始********************
#ifndef _CTSTRING_H_
#define _CTSTRING_H_

class CTString
{
public:
    //默认构造函数
    CTString();

    //用n个字符ch来初始化
    CTString(int n, char ch);

    //直接用C风格字符串来初始化
    CTString(char *pData);

    //复制构造函数
    CTString(const CTString &src);

    //析构函数
    ~CTString();

    //功能: 完成串的复制
    //参数: src --待复制的指向CTString类对象串
    //返回: dest
    CTString *Copy(CTString *src);

    //功能: 完成串的复制
    //参数: src --待复制的C字符串
    //返回: 指向CTString类对象的指针
    CTString *Copy(char *src);

    //功能: 完成串的连接
    //参数: src --待连接在后面的CTString对象串
    //返回: dest
    CTString *Connect(CTString *src);

    //功能: 完成串的连接
    //参数: src --待连接在后面的C字符串
    //返回: dest
    CTString *Connect(char *src);

    //功能: 在主串中查找子串pSubstr
    //参数: pSubstr --指向子串
    //返回: 找到则返回指向找到的位置的下标,若没有找到,则返回-1
    int Find(const CTString *pSubstr) const;

    //功能: 在主串中查找子串substr
    //参数: substr --子串的引用
    //返回: 找到则返回指向找到的位置的下标,若没有找到,则返回-1
    int Find(const CTString &substr) const;

    //功能: 在中查找单个字符ch
    //参数: ch --待查找的字符
    //返回: 找到则返回指向该字符在主串中的位置的下标,若没有找到,刚返回-1
    int Find(char ch) const;

    //功能: 输出字符数据
    //参数: 无
    //返回: 无
    void Print() const;

    //功能: 判断字符串是否为空
    //参数: 无
    //返回: 若不为空,返回真;若为空,返回假
    bool Empty() const;

    //功能: 返回字符串的长度
    //参数: 无
    //返回: 返回字符串的长度--int类型
    int Size() const;

    //重载操作符 +
    //friend const CTString & operator+ (CTString & str1, const CTString & str2);

    //功能: 返回m_sCount的值
    static int getCount();

private:
    char *m_pData;     //用于保存字符数据
    int  m_nLen;       //记录字符长度
    static int m_sCount;  //记录创建对象的个数
};

#endif
//*****************CTString类的声明结束********************

#include <iostream>
#include <cstring>
using namespace std;

#include "CTString.h"

//****************静态成员初始化*****************
int CTString::m_sCount = 0;

//**************默认构造函数实现部分*************
CTString::CTString()
{
    m_pData = NULL;
    m_nLen = 0;
    m_sCount ++;
    cout << "constrcutor  CTString()  called" << endl;
}

//*********构造函数--用n个字符ch来初始化********
CTString::CTString(int n, char ch)
{
    m_sCount ++;
    m_nLen = n;
    m_pData = new char[n+1];
   int i;
    for (i = 0; i < n; i++)
    {
        m_pData[i] = ch;
    }
    m_pData[i] = '\0';
    cout << "constrcutor  CTString(int n, char ch)  called" << endl;
}

//**************带参数构造函数实现部分***********
CTString::CTString(char *pData)
{
    m_sCount ++;
    m_nLen = strlen(pData);
    m_pData = new char[m_nLen + 1]; //预留一个位置给'\0'

    strncpy(m_pData, pData, m_nLen);
    m_pData[m_nLen] = '\0';
    cout << "constrcutor  CTString(char *pData)  called" << endl;
}

//***************复制构造函数实现部分************
CTString::CTString(const CTString &src)
{
    
    if (this->m_pData != NULL)
    {
        delete this->m_pData;
    }
    m_sCount ++;
    this->m_pData = new char[src.m_nLen+1];

    strncpy(this->m_pData, src.m_pData, src.m_nLen);
    this->m_pData[src.m_nLen] = '\0';
    this->m_nLen = src.m_nLen;

    cout << "copy constrcutor CTString(const CTString &src) called" << endl;
}

//*****************析构函数实现部分**************
CTString::~CTString()
{
    cout << "destructor called" << endl;
    delete m_pData;
}

//********************************************************
//功能: 完成串的复制
//参数: dest --src的备份   src --待复制的串
//返回: dest
CTString* CTString::Copy(CTString *src)
{
    delete this->m_pData;

    this->m_pData = new char[src->m_nLen+1];
    strncpy(this->m_pData, src->m_pData, src->m_nLen);
    this->m_pData[src->m_nLen] = '\0';
    this->m_nLen = src->m_nLen;

    return this;
}

//*********************************************************
//功能: 完成串的复制
//参数: src --待复制的C字符串
//返回: 指向CTString类对象的指针
CTString* CTString::Copy(char *src)
{
    //释放原有空间内存
    delete this->m_pData;

    int len = strlen(src);
    this->m_pData = new char[len+1];
    strncpy(this->m_pData, src, len);
    this->m_pData[len] = '\0';
    this->m_nLen = len;

    return this;
}

//*********************************************************
//功能: 完成串的连接
//参数: dest --两个串连接后得到的串   src --待复制的串
//返回: dest
CTString * CTString::Connect(CTString *src)
{
    int len = this->m_nLen + src->m_nLen;
    char *tmp = new char[len + 1];
    strncpy(tmp, this->m_pData, this->m_nLen);
    tmp[this->m_nLen] = '\0';
    strncat(tmp, src->m_pData, src->m_nLen);
    tmp[len] = '\0';

    return new CTString(tmp);
}

//**********************************************************
//功能: 完成串的连接
//参数: src --待连接在后面的C字符串
//返回: dest
CTString* CTString::Connect(char *src)
{
    int len = strlen(src) + this->m_nLen;
    char *tmp = this->m_pData;
    this->m_pData = new char[len+1];
    int i, j;

    for (i = 0; i < strlen(tmp); i++)
    {
        this->m_pData[i] = tmp[i];
    }
    for (j = 0; j < strlen(src); i++, j++)
    {
        this->m_pData[i] = src[j];
    }
    this->m_pData[len] = '\0';

    delete tmp;

    return this;

}

//**********************************************************
//功能: 在主串中查找子串pSubstr
//参数: pSubstr --指向子串
//返回: 找到则返回指向找到的位置下标,若没有找到,则返回-1
int CTString::Find(const CTString *pSubstr) const
{
    int i = 0, j = 0, index = 0;
    int len1 = this->m_nLen,
        len2 = pSubstr->m_nLen;

    i = 0;
    while (i < len1 && j < len2)
    {
        if (this->m_pData[i] == pSubstr->m_pData[j])
        {
            i ++;
            j ++;
        }
        else
        {
            index ++; //主串位置回溯
            i = index;
            j = 0;
        }
    }

    if (j == len2)
    {
        return index;
    }

    return -1;
}

//****************************************************
//功能: 在主串中查找子串substr
//参数: substr --子串的引用
//返回: 找到则返回指向找到的位置的下标,若没有找到,则返回-1
int CTString::Find(const CTString &substr) const
{
    int i = 0, j = 0, index = 0;

    while (i < this->m_nLen && j < substr.m_nLen)
    {
        if (this->m_pData[i] == substr.m_pData[j])
        {
            i ++;
            j ++;
        }
        else
        {
            index ++;
            i = index;
            j = 0;
        }
    }

    if (j == substr.m_nLen)
    {
        return index;
    }

    return -1;

}

//****************************************************
//功能: 在中查找单个字符ch
//参数: ch --待查找的字符
//返回: 找到则返回指向该字符在主串中的位置的下标,若没有找到,刚返回-1
int CTString::Find(char ch) const
{
    for (int i = 0; i < strlen(this->m_pData); i++)
    {
        if (this->m_pData[i] == ch)
        {
            return i;
        }
    }

    return -1;
}

//*************************************************
//功能: 输出字符数据
//参数: 无
//返回: 无
void CTString::Print() const
{
    if (this->m_pData)
    {
        cout << this->m_pData << endl;
    }
}

//*************************************************
//功能: 判断字符串是否为空
//参数: 无
//返回: 若不为空,返回真;若为空,返回假
bool CTString::Empty() const
{
    if (this->m_nLen)
    {
        return false;
    }
    return true;
}

//*************************************************
//功能: 返回字符串的长度
//参数: 无
//返回: 返回字符串的长度--int类型
int CTString::Size() const
{
    return this->m_nLen;
}

//************************************************
//功能: 返回m_sCount的值
int CTString::getCount()
{
    return m_sCount;
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



目录
相关文章
|
15天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
25 2
|
21天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
54 5
|
27天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
56 4
|
28天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
66 4
|
2月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
29 4
|
2月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
25 4
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
23 1
|
2月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)
|
2月前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
17 0
|
2月前
|
存储 编译器 C语言
深入计算机语言之C++:类与对象(上)
深入计算机语言之C++:类与对象(上)