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


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



目录
相关文章
|
10月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
6月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
162 0
|
6月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
254 0
|
8月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
298 12
|
9月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
178 16
|
9月前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
9月前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。
|
9月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
477 6
|
9月前
|
编译器 C++
类和对象(下)C++
本内容主要讲解C++中的初始化列表、类型转换、静态成员、友元、内部类、匿名对象及对象拷贝时的编译器优化。初始化列表用于成员变量定义初始化,尤其对引用、const及无默认构造函数的类类型变量至关重要。类型转换中,`explicit`可禁用隐式转换。静态成员属类而非对象,受访问限定符约束。内部类是独立类,可增强封装性。匿名对象生命周期短,常用于临时场景。编译器会优化对象拷贝以提高效率。最后,鼓励大家通过重复练习提升技能!
|
10月前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。