对于在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;
}