通过C++创建一个String类,并实现String类中的相关操作
1.先对String类进行声明(为了测试方便将类的成员函数的声明与实现都放在了String.h中):
class String
{
public:
String(const char *str=NULL);//通用构造函数
String(const String &another);//拷贝构造函数
~String(){}//析构函数
String& operator=(const String &rhs);//重载赋值=函数
String& operator+(const String& rhs);//重载+
String& operator+=(const String& rhs);//重载+=
String& operator++(const String& rhs);//重载++
char& String::operator[](int n) const;//重载[]
friend std::ostream& operator<<(std::ostream& os,const String &des);//重载输出<<运算符
friend std::istream& operator>>(std::istream& is, String &des);//重载输入>>运算符
/*这两个函数在该实例中没有用
size_t size() const;//获取长度 size_t 为unsigned int (在默认情况下声明的整型变量都是有符号的类型(char有点特别))
const char* c_str() const;//获取c字符串
*/
private:
char* m_data;//用于保存字符串首地址
size_t length;//记录String类对象的长度
};
2.对成员函数进行实现
//String的构造函数
String::String(const char *str){
if(!str){//如果字符串为空
this->m_data=new char[1];
this->m_data='\0';
}else{//字符串非空
this->lenght = strlen(str);
this->m_data = new char[length+1];
strcpy(this->m_data,str);
}
}
//析构函数
String::~String(){
delete[]m_date;
this->length = 0;
}
//拷贝构造函数;这里就涉及浅拷贝与深拷贝的知识点(后期学习了再做解析)
String::String(const String &another){
//拷贝构造的实现方法与构造函数思路大同小异,只不过构造函数传递的参数是char类型,而拷贝构造函数传递的函数类为自定义的String类。
this->length = anothor.length;
this->m_data = new char[length+1];
memcpy(m_data,another.m_data,length);//进行复制
}
//重载赋值=函数
String& operator=(const String &rhs){
//先进行对两个对象内容是否一致的判断
if(m_data==&rhs){//例如 s1=s1;那么两者的地址肯定一致
return *this;
}
delete[]m_data;
this->length = rhs.length;//如果内容不一致
m_date = rhs.m_date;
return *this;
}
//重载+
String& operator+(const String& rhs){
//对于+运算符的重载,主要是要对两个对象进行判断,有没有为空的对象,如果没有就可以用strcat()函数将两个字符串连接
String merge_str;//定义一个之间变量
if(!this->m_data){//s1+s2;这里this->m_data就是指的s1中的m_data,s2就是rhs;
merge_str.m_data=rhs.m_data;
}else if(!rhs){
merge_str.m_data=this->m_data;
}else{
size_t Total_len = this->length + rhs.length + 1;
merger_str.m_date = new char[Total_len];
strcpy(merger_str.m_date, this->m_date);
strcat(merger_str.m_date, rhs.m_date);
}
this->m_data = merge_str.m_data;
return *this;
}
//重载+=;其实就是先+后= s1+=s2---->s1 = s1+s2
String& operator+=(const String& rhs){
if (this->length==0) {
return *this=others;
}
else if (others.length==0) {
return *this;
}
else {
this->length += others.length;
char* NewData = new char[length+1];
strcpy(NewData, this->m_data);
strcat(NewData, others.m_data);
delete[]m_data;
this->m_data = NewData;
return *this;
}
}
String& operator==(const String& rhs){
if(this->length!=rhs.length){
return false;
}
return strcmp(this->m_data,rhs.m_data)?false:true;//strcmp(s1,s2);返回两个字符串的差值,相同返回0,不同返回-1
}
//重载小标运算符
char& String::operator[](int n) const {
if (n>= int(this->length)) {
return m_date[length-1];//如果下标过大就默认输出最后一个字母(length-1)最后是空格所以要减1
}
else {
return m_date[n-1];
}
}
//重载输出<<运算符
std::ostream& operator<<(std::istream& os,const String &des){
os<<des.m_data;
return os;
}
//重载输出>>运算符。
//该运算符重载主要涉及的就是将键盘输入的C字符串保存,然后将其内容复制到String类对象。
std::istream& operator>>(std::istream& is, String &des){
//第一步接收字符串,定义一个相对较大的char类型数组
char str[100] = {0};
is>>str;//
int len = strlen(str);
des.m_data = new char[des.length+1];
strcpy(des.m_data,str);
return is;
}
/*
//获取长度 size_t 为unsigned int (在默认情况下声明的整型变量都是有符号的类型(char有点特别))
size_t Srting::size() const{
return this->length;//只需要返回所创对象的长度就可以,因为在创建对象时就会调用构造函数对length进行初始化
}
//获取c字符串
const Striing::char* c_str() const{
return m_data;//与获取长度一样的思路,m_data就存储了对象存储数据的地址
}
*/
3.main.cpp(测试如下)
int main(){
/*对于String类的测试---String.h*/
String str_1("hello");
String str_2("world");
String str_3;
str_3 = str_1+str_2;//这里是先调用了+然后再调用=,相当于str_1=str_1+str_2;str_3=str_1
cout << "测试重载运算符+:str_3="<<str_3 << endl;
cout << "str_1=" << str_1 << endl;//此时str_1存储的内容已经是helloworld了
str_1 += str_2;
cout << "测试重载运算符+=:str_1=" << str_1 << endl;
cout << "测试重载运算符==:" << endl;
if (str_1 == str_2) {cout << "yes" << endl;
}else {cout << "no" << endl;}
cout << "测试重载运算符[]:" << endl;
cout << str_2[2] << " " << str_2[3] << " " << str_2[9] << endl;
return 0;
}
4.测试结果如下图所示:
这里是参考内容(根据该博主的思路写的)https://www.cnblogs.com/zhizhan/p/4876093.html