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;
}

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

时间: 2024-08-03 09:20:59

C++设计CTString类的相关文章

编程-设计一个类用来表达两张牌的牌组,设计这个类的初始化方式

问题描述 设计一个类用来表达两张牌的牌组,设计这个类的初始化方式 设计一个类表达一组牌,设计牌组的初始化方式 //牌值 private string face; //花色 private string suit; public zupai(string suit, string face) { this.face = face; this.suit = suit; } //牌子 public string getFace() { return face; } //花色 public string

软件工程之系统建模篇:设计系统类模型

类模型是面向对象分析的核心,系统类模型用包图描述,前面的文章我们分析 了实体类.接口类.接口控制类和用例控制类,本章我们将介绍系统类模型的设 计,首先简要介绍类模型的设计方法,然后设计子系统的类模型,最后设计系统 类模型. 1.设计方法 设计系统类模型,要明确子系统或系统的组成,及各个组成部分之间的关系, 子系统的划分和前面介绍过的接口类包的划分相同,主要包括:发文办理.收文 办理.会议管理.档案管理.公告管理.个人助理.系统管理.用户登录8个子系 统,无论是子系统模型还是系统类模型,都包含接口

软件工程之系统建模篇:设计接口类模型

本文介绍接口类模型的设计过程.接口类模型描述系统活动者与系统交互的界 面,接口类位于系统结构的表示服务层,接口类模型用类图和包图描述.首先简 要介绍接口类模型的设计方法,然后设计子系统的类图,最后设计系统及子系统 的包图. 1.设计方法 设计接口类模型,首先要识别出接口类,再识别出接口类之间的关系.接口类 是应用程序的"可视区",也是系统与外界的隔离层.接口类可以用 用例去识别,用例驱动接口类设计.用户接口直接与用例相连,用户是通过用户 接口发起和终止用例的.由于用户接口直接面向用户,

java-JAVA如何设计实体类????

问题描述 JAVA如何设计实体类???? 场景: 1. 前台要显示一张表格,表格中的栏位对应于数据库中A,B表的数据A与B是一对多的关系. 问题: 1. 我从网上看到JAVA设计实体类一般都是一个实体类对应一张表,可是我要通过A,B表连接查询.这个实体类又该如何设计? 我是刚刚学习JAVA的菜鸟,求大神解惑! 解决方案 设计两个类A,B,一对多关系通过组合实现. 示例代码,B表关联多个A表记录: public class A{ } public class B{ List<A> list; }

求推荐数据库设计和类设计书籍

问题描述 就是拿到一个问题,该怎么设计数据库的表结构,怎么设计类图,感觉自己毫无经验,可以看什么书提高吗?感觉表设计和类图设计不一定能对应,表只能是行列关系表,类可以有各种设计模式.谢谢 解决方案 本帖最后由 gunziyang 于 2016-07-08 15:04:41 编辑解决方案二:<自己动手设计数据库>其实你还可以去网上看看视频传智播客就不错,全是免费的,没基础也能看懂

C++第5周项目1 - 设计三角形类

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8723847 [项目1]设计三角形类,通过增加构造函数,使对象在定义时能够进行初始化 #include<iostream> using namespace std; class Triangle {public: double perimeter(void);

photoshop设计茶类主题商品宣传海报制作教程

给各位photoshop软件的使用者们来详细的解析分享一下设计茶类主题商品宣传海报的制作教程. 教程分享: 最终效果   素材准备:由于要营造真实感,所以我们找了一些照片性质的素材.   1.将产品与文字摆放到画面当中,确定它们的位置.       2.将准备好的照片素材粗略的拼合于画面的背景当中.           3.把之前粗糙的石头处理成平整且能摆放产品的造型,同时运用调整图层当中的"色彩平衡.曲线.通道混合器"等命令把背景中的不同元素进行色彩的统一.     4.在背景中加上

联想企业网盘成功案例之设计研究类公司

2011年,云存储火速成为大家眼中的"下一个金矿":然而,对于天津X水泥工业设计研究院有限公司来说,云存储是已经获得收益的那个金矿.因为,这一次他们走在了众多企业的前面,他们几乎可以算得上是第一批享受云存储并从中获益的掘金者. 早在2009年,天津X水泥工业设计研究院有限公司就已携手联想企业网盘,率先开始了企业的云存储运用.联想企业网盘为天津X水泥工业设计研究院有限公司的数据管理提供了高效安全的全面解决方案.而"在数据资产价值日益提高的今天,快速.便捷.安全地对企业数据资产进

c++在运行期间不会自动检查数组是否越界,设计一个类检查数组是否越界

/* c++在运行期间不会自动检查数组是否越界,设计一个类检查数组是否越界. */ #include <iostream> #include <string> using namespace std; class check { public: check(char*s) { str=new char[strlen(s)+1]; strcpy(str,s); len=strlen(s); } char operator[](int n) { if(n>len-1) { cou