第八天2017/04/17(2、❤String类的源代码)
来源:互联网 发布:c语言有什么用途 编辑:程序博客网 时间:2024/06/05 18:16
改进版本: 1.对operator+运算符进行了重新定义:修复了执行完s1+s2后,会把s1修改的bug---返回String 2.对operator+=运算符进行了重新定义:资源利用 -->operator+ ---返回String& 3.连等操作 a=b=c; ---返回引用String& 4.[]、<<、>> ---返回值作左值,返回引用&【注解】 为什么operator+返回String,而operator+=返回String&?答:根据用户的需求---> 因为operator+=执行完后,左值被修改,而operator+执行完后,左值不能被修改。
//String.h#ifndef _STRING_H_#define _STRING_H_#include <iostream>using namespace std;class String{public://构造函数 String(); String(int n,char c); String(const char *source);//析构函数 ~String();//拷贝构造函数 String(const String& s);//-------------------------------------------------------------------//重载 = :返回的是String&,“连等a=b=c” String& operator=(char *s); String& operator=(const String& s);//-------------------------------------------------------------------//重载 + :返回的是String (s=s1+s2;因为如果用String&,会使在执行完+后,s1的值也发生变化) //friend String operator+(const String& s1,const String& s2); String operator+(const String& s); //friend String operator+(const String& s,const char* str); String operator+(const char* s); //重载 += :返回的是String& //friend String& operator+=(String& s1, const String& s2); String& operator+=(const String& s); //friend String& operator+=(String& s,const char* str); String& operator+=(const char* str);//-------------------------------------------------------------------//重载 [] :返回的是char& char& operator[](int i); const char& operator[](int i) const;//重载 << >> :返回的是ostream& friend ostream& operator<<(ostream &out,String &s); friend istream& operator>>(istream &in ,String &s);//-------------------------------------------------------------------//friend函数:重载> < == != friend bool operator<(const String& s1,const String& s2); friend bool operator>(const String& s1,const String& s2); friend bool operator==(const String& s1,const String& s2); friend bool operator!=(const String& s1,const String& s2);//属性 int lenght(); char* get_data();private: int size; //除了'\0'字符外的字符个数 char *data;};#endif =====================================================================================//String.cpp#include "String.h"//构造函数String::String() //即使是空字符串,也要进行分配内存空间,因为空字符串有一个字符'\0'{ size = 0; data = new char[1]; *data = '\0'; //空字符串只有一个元素 '\0'}String::String(int n,char c) //创建一个字符串:由n个c和一个'\0'组成{ size = n; data = new char[n+1]; //分配n+1个空间 char *ch = data; //用ch指针对data中的每一个字符赋值 while(n>0) //n个c { *ch = c; ch++; n--; } *ch = '\0'; }String::String(const char *source){ if(source == NULL) //如果source是NULL { size = 0; data = new char[1]; *data = '\0'; } size = strlen(source); data = new char[size+1]; strcpy(data,source);}//析构函数String::~String(){ if(data != NULL) { delete []data; data = NULL; size = 0; }}//拷贝构造函数String::String(const String& s) { size = s.size; data = new char[size+1]; strcpy(data,s.data); }//重载 = :返回值是String&String& String::operator=(char *s){ if(data != NULL) { delete []data; } size = strlen(s); data = new char[size+1]; strcpy(data,s); return *this;}//重载 = :返回值是String&String& String::operator=(const String& s){ if(this == &s) return *this; if(data != NULL) delete []data; size = s.size; data = new char[size+1]; strcpy(data,s.data); return *this;}//=============================================================================//重载 + :返回值是String,返回的应该是一个临时对象//下面四种case分别从友元函数、成员函数角度去实现operator+函数//case1://String operator+(const String& s1,const String& s2) //友元函数//{// String tmp; //创建一个临时变量// tmp.size = strlen(s1.data)+strlen(s2.data);// tmp.data = new char[tmp.size+1];// strcpy(tmp.data,s1.data);// strcat(tmp.data,s2.data);// return tmp; //返回临时对象,返回类型是String//}String String::operator+(const String& s) //成员函数{ String tmp;//创建一个临时变量 tmp.size = size+s.size; tmp.data = new char[tmp.size+1]; strcpy(tmp.data,data); strcat(tmp.data,s.data); return tmp;}//case2://String operator+(const String& s,const char* str) //友元函数//{// String tmp;// tmp.size = s.size+strlen(str);// tmp.data = new char[tmp.size+1];// strcpy(tmp.data,s.data);// strcat(tmp.data,str);// return tmp;//}String String::operator+(const char* s) //成员函数{ String tmp; tmp.size = size+strlen(s); tmp.data = new char[tmp.size+1]; strcpy(tmp.data,data); strcat(tmp.data,s); return tmp;}//重载 += :返回值是String//case1://String& operator+=(String& s1, const String& s2) //友元函数//{// //s1.size = s1.size+s2.size;// //char *tmp = new char[s1.size+1];// //strcpy(tmp,s1.data);// //if(s1.data!=NULL)// // delete []s1.data;// //strcat(tmp,s2.data);// //s1.data = tmp;// //return s1;//////调用上面已经实现的的operator+// s1 = s1+s2;// return s1;//}String& String::operator+=(const String& s) //成员函数{ size = size+s.size; char *tmp = new char[size+1]; strcpy(tmp,data); if(data!=NULL) delete []data; strcat(tmp,s.data); data = tmp; return *this;////调用上面已经实现的的operator+ //*this = *this+s; //return *this;}//case2://String& operator+=(String& s,const char* str) //友元函数//{////调用上面已经实现的的operator+// s = s+str;// return s;//}String& String::operator+=(const char* str) //成员函数{ size = size+strlen(str); char *tmp = new char[size+1]; strcpy(tmp,data); if(data!=NULL) delete []data; strcat(tmp,str); data = tmp; return *this;////调用上面已经实现的的operator+// *this = *this+str; // return *this;}//=============================================================================//重载 []char& String::operator[](int i) //传入的是下标,返回的是字符的引用{ return data[i];}const char& String::operator[](int i) const{ return data[i];}//重载 << >>ostream& operator<<(ostream &out,String &s){ out<<s.data; return out;}istream& operator>>(istream &in ,String &s){ in>>s.data; return in;}//friend函数:重载> < == !=bool operator<(const String& s1,const String& s2){ if(strcmp(s1.data,s2.data)<0) return true; else return false;}bool operator>(const String& s1,const String& s2){ if(strcmp(s1.data,s2.data)>0) return true; else return false;}bool operator==(const String& s1,const String& s2){ if(strcmp(s1.data,s2.data)==0) return true; else return false;}bool operator!=(const String& s1,const String& s2){ if(strcmp(s1.data,s2.data)!=0) return true; else return false;}//属性int String::lenght(){ return size;}char* String::get_data(){ return data;}=====================================================================================//test.cpp#include "String.h"int main(){ String s1("AAA"); String s2("BBB");//连加操作:返回值是String cout<<"测试连加操作:"<<endl; String s3 = s1+s2+"CCC"; cout<<"s1="<<s1<<",s2="<<s2<<",s3="<<s3<<endl;//+= cout<<"测试+=操作:"<<endl; s1 += s2; cout<<"s1 += s2的结果:"<<"s1="<<s1<<",s2="<<s2<<endl; s1 += "QQQ"; cout<<"s1 += QQQ 的结果:"<<"s1="<<s1<<endl;//连等操作:返回值是String& cout<<"测试连等操作:"<<endl; String s4 = s1 = s3 = s2 ; cout<<"s1="<<s1<<",s2="<<s2<<",s3="<<s3<<",s4="<<s4<<endl;}
1 0
- 第八天2017/04/17(2、❤String类的源代码)
- String的方法-第八天
- 黑马程序员——第八天(String类)
- 第八天2017/04/17(3、C++的几个语法)
- 第八天2017/04/17(1、拷贝构造、❤临时对象)
- 时运好转的一天(第八天)
- 我的android(第八天)
- 学习的第八天
- JAVASCRIPT的第八天
- JAVA 学习第八天(2)IO
- 实习后的第八天
- 黑马程序员的第八天
- 学习iOS的第八天
- 学习C的第八天
- 2017/7/31 第八天
- 2017暑假训练第八天
- 第八天(Using Models)
- Android 第八天(下午)
- linux内核中红黑树代码理解
- Linux 查看日志的命令
- python报表(pygal)
- Training in YOLOv2 with your data
- 如何实现团队敏捷
- 第八天2017/04/17(2、❤String类的源代码)
- 全面解读HTTP Cookie
- 喵呜,又要配置环境
- oracle索引 总结
- ITK resample图像重采样
- BOS WebService 接口开发
- Vue.js学习系列(四十七)-- 路由
- LiteOS学习第三篇——los_config.h 配置文件的理解
- JAVA-抽象类、接口、继承