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

来源:互联网 发布:百度鹰眼定位软件 编辑:程序博客网 时间:2024/06/06 00:35
   对于在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;}
阅读全文
0 0