C++中,自定义string类,实现字符串的赋值“=”和连接函数“+”

本文介绍如何在C++中自定义一个String类,并通过成员函数和友元函数实现字符串的赋值和连接操作,即运算符重载。文章详细解释了运算符重载的概念及其在自定义类中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   对于在C语言中,我们使用指针可以轻而易举的实现字符串的拷贝和连接等,在C++中,C在里面是完全兼容的,所以我们就可以在这里大展伸手,开始我们的C++的学习之旅,这篇文章我们实现自定义一个string类,实现字符串的赋值和连接,也就是C++里所谓的运算符重载;运算符重载是使用函数实现的,我们应该遵循函数的一些规则。
   这里我说一下对于为什么进行运算符重载?我个人来看,大部分的运算符只适用于基本的数据类型,要想实现对象之间的运算,就得用到运算符重载了。
   对于不能重载的 运算符(取成员 .  ?号表达式   “?:” sizeof  作用域::)。
   对于运算符重载的语法格式:
   <返回值类型> operator <运算符符号 >(<参数列表>)
   {
    函数体; 
   }

对于重载 ,我们有两种方式,1成员函数运算符重载,2 友元运算符重载,这两种方式我会在代码中都会涉及到,如代码所示,我在实现运算符“=”重载的时候使用的是成员函数运算符重载,在“+”使用的是友元运算符重载。
对于为什么要使用这两个呢?在我看来,在自己定义一个类的时候,只有公有(public)的可以去访问私有的(private),也就是使用类的公有成员去访问它的私有成员,要么就是通过声明这个函数是友元函数。这就可以去访问一个类的私有成员了。

这是xstring.h 头文件

#include <iostream>
using namespace std;
class String
{
private:
    char * m_data; //用于保存字符串
    int length;     //字符数组的大小
public:
    // 无参构造函数
    String()
    {
        m_data = 0;
        length = 0;
    }
    // 拷贝构造函数
    String(const String &s);
    //定义初始化构造函数
    String(const char *s);

    // 析构函数
    ~String()
    {
        delete[] m_data;
    }
    //打印字符串
    void primsg()
    {
        cout << "字符串为:" << this->m_data << endl;
    }
    // 赋值函数
    void operator = (const String &s);
    //连接函数实现字符串相加
    friend String operator + (const String &s1, const String &s2);

};

xtring.c

#include "xString.h"
//求字符串的长度
int xstrlen(const char *arr)
{
    for (int i=0; arr[i] != '\0'; i++)
    {}
    return i;
}
//字符串拷贝
char * xstrcpy(char *des, const char *src)
{
    char *tmp = des;
    while ((*des++ = *src++) != '\0');
    return tmp;
}
//自符串连接函数
char *xstrcat(char *des, const char *src)
{
    char *tmp = des;
    int lenth = xstrlen(des);
    while (*src != '\0')
    {
        *(des + lenth) = *(src);
        src++;
        des++;
    }
    *(des + lenth) = *(src);
    return tmp;
}

//实现拷贝构造函数
String::String(const String &s)
{
    length = s.length;
    if (s.m_data)
    {
        m_data = new char[length + 1];
        xstrcpy(m_data, s.m_data);
    }
    else
        m_data = 0;
}
    //构造函数
String::String(const char *s)
{
    length = xstrlen(s);
    m_data = new char[length + 1];
    xstrcpy(m_data, s);
}
    //=重载
void String::operator = (const String &s)
{
    if (m_data)  delete[] m_data;
    length = s.length;
    if (s.m_data)
    {
        m_data = new char[length + 1];
        xstrcpy(m_data, s.m_data);
    }
    else
        m_data = 0;
}

//+重载
String operator + (const String &s1, const String &s2)
{
    String tmp;
    tmp.length = s1.length + s2.length;
    tmp.m_data = new char[tmp.length + 1];
    xstrcpy(tmp.m_data, s1.m_data);
    xstrcat(tmp.m_data, s2.m_data);
    return tmp;
}

test.c

#include "xString.h"

int main()
{
    String s1("hello");
    s1.primsg();
    String s2=s1;
    s2.primsg();
    String s3(" world");
    s3.primsg();
    String s4 = s1 + s3;
    s4.primsg();
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值