一.历史遗留问题
- C语言不支持真正意义上的字符串
- C语言用
字符数组和原生函数实现字符串操作 - C语言
不支持自定义类型,因此无法获得字符串类型 - 在C++中也不支持字符串,但是C++可以自定义类型,可以通过
类进行字符串类型定义
二.实现字符串类的注意对象
- 无缝实现
String对象与char*字符串的的互相操作 - 需要考虑操作符重载函数是否支持const版本
- 通过C语言中
字符串实现字符串类的成员函数
三.字符串相关接口函数
3.1 头文件String.h
#pragma once
#include <iostream>
using namespace std;
class String
{
protected:
int m_length;//字符串的长度
char* m_str;
void init(const char* s);
public:
String();
~String();
String(char c);
String(const char* str);
String(const String& s);//赋值拷贝
int length();//字符串长度
const char* c_str() const;//字符串转换函数
//比较操作符函数重载
bool operator == (const String& s)const;
bool operator == (const char* s)const;
bool operator != (const String& s)const;
bool operator != (const char* s)const;
bool operator > (const String& s)const;
bool operator > (const char* s)const;
bool operator < (const String& s)const;
bool operator < (const char* s)const;
bool operator >= (const String& s)const;
bool operator >= (const char* s)const;
bool operator <= (const String& s)const;
bool operator <= (const char* s)const;
//加法操作符重载
String operator + (const String& s)const;
String operator + (const char* s)const;
String operator += (const String& s);
String operator += (const char* s);
//赋值操作符重载
String& operator = (const String& s);
String& operator = (const char* s);
String& operator = (const char c);
};
3.2 完整代码
#define _CRT_SECURE_NO_WARNINGS
#include "String.h"
#include <iostream>
#include <cstring>
#include <cstdio>
void String::init(const char* s)
{
m_str = _strdup(s);
if (m_str)
{
m_length = strlen(m_str);
}
else
{
cout << "init failed\n" << endl;
}
}
String::String()
{
init("");//传入一个空字符串
}
String::String(char c)
{
char s[] = { c,'\0' };//传入字符数组
init(s);
}
String::String(const char* str)
{
init(str?str:"");//这里判断一下是为了防止传入空指针
}
String::String(const String& s)//赋值拷贝
{
init(s.m_str);
}
int String::length()
{
return m_length;
}
const char* String::c_str()const
{
return m_str;
}
bool String :: operator == (const String& s) const
{
return (strcmp(m_str, s.m_str)==0);
}
bool String::operator==(const char* s)const
{
return ((strcmp(m_str, s ? s : "")) == 0);
}
bool String :: operator != (const String& s) const
{
return !(*this == s);
}
bool String::operator != (const char* s)const
{
return !(*this == s);
}
bool String ::operator > (const String& s)const
{
return (strcmp(m_str, s.m_str) > 0);
}
bool String ::operator > (const char* s)const
{
return ((strcmp(m_str, s ? s : "")) > 0);
}
bool String ::operator < (const String& s)const
{
return (strcmp(m_str, s.m_str) < 0);
}
bool String ::operator < (const char* s)const
{
return ((strcmp(m_str, s ? s : "")) < 0);
}
bool String ::operator >= (const String& s)const
{
return (strcmp(m_str, s.m_str) >= 0);
}
bool String ::operator >= (const char* s)const
{
return ((strcmp(m_str, s ? s : "")) >= 0);
}
bool String ::operator <= (const String& s)const
{
return (strcmp(m_str, s.m_str) <= 0);
}
bool String ::operator <= (const char* s)const
{
return ((strcmp(m_str, s ? s : "")) <= 0);
}
String String :: operator + (const String& s)const
{
return (*this + s.m_str);
}
String String :: operator + (const char* s)const
{
int len;
String ret;
len = m_length + strlen(s ? s : "");
char *str = reinterpret_cast<char*>(malloc(len + 1));
if (str)
{
strcpy(str,m_str);
strcat(str,s);
free(ret.m_str);
ret.m_str = str;
ret.m_length = len;
}
else
{
cout << "no mem to malloc" << endl;
}
return ret;
}
String String :: operator += (const String& s)
{
return (*this = *this + s.m_str);
}
String String :: operator += (const char* s)
{
return (*this = *this + s);
}
String& String ::operator = (const String& s)
{
return (*this = s.m_str);//调用下面的赋值操作符重载
}
String& String ::operator = (const char* s)
{
if (m_str != s)
{
char* str = _strdup(s ? s : "");
if (str)
{
free(m_str);
m_str = str;
m_length = strlen(str);
}
else
{
cout << "no mem to malloc" << endl;
}
}
else
{
cout << "str is equal to m_str" << endl;
}
return *this;
}
String& String ::operator = (const char c)
{
char s[] = { c,'\0' };
return (*this = s);
}
String :: ~String ()
{
free(m_str);
}
void test_1()
{
cout << "test_1() begin ... " << endl;
String s;
s = 'D';
cout << s.c_str() << endl;
cout << s.length() << endl;
cout << (s == "D") << endl;
cout << (s > "CCC") << endl;
s += " Zhang ";
cout << s.c_str() << endl;
cout << s.length() << endl;
cout << (s == "D Zhang ") << endl;
cout << "test_1() end ... " << endl;
}
void test_2()
{
cout << "test_2() begin ... " << endl;
String a[] = { "E", "D", "C", "B", "A" };
String min = a[0];
for (int i = 0; i < 5; i++)
{
if (min > a[i])
{
min = a[i];
}
}
cout << "min = " << min.c_str() << endl;
cout << "test_2() end ... " << endl;
}
int main()
{
test_1();
//test_2();
return 0;
}
结果:
四.小结
- C++语言通过自定义字符串实现字符操作
- 字符串的成员函数可由C语言字符串函数实现