改进版本:1.对operator+运算符进行了重新定义:修复了执行完s1+s2后,会把s1修改的bug---返回String2.对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;elsereturn false;
}
bool operator>(const String& s1,const String& s2)
{if(strcmp(s1.data,s2.data)>0)return true;elsereturn false;
}
bool operator==(const String& s1,const String& s2)
{if(strcmp(s1.data,s2.data)==0)return true;elsereturn false;
}
bool operator!=(const String& s1,const String& s2)
{if(strcmp(s1.data,s2.data)!=0)return true;elsereturn 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");
//连加操作:返回值是Stringcout<<"测试连加操作:"<<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;
}

第八天2017/04/17(2、❤String类的源代码)相关推荐

  1. 第八天2017/04/17(3、C++的几个语法)

    1. 必须用成员初始化列表的三种形式: const成员 引用成员 C++编译器不知道如何构造某个类 #include <iostream> using namespace std; cla ...

  2. 第八天2017/04/17(1、拷贝构造、❤临时对象)

    调用拷贝构造函数的三种case 1. MyPoint p2 = p1; MyPoint p2(p1);case1中的重点:MyPoint p3 = MyPoint(3,3); //此时:C++编译器进 ...

  3. 04 能够使用String类常用方法操纵字符串 0214

    04 能够使用String类常用方法操纵字符串 0214 1 2 3 4

  4. java/04/String类的特点,String的常用方法,this关键字

    java/04/String类的特点,String的常用方法,this关键字 String 是一个字符串类型的类,使用"""双引号定义的内容都是字符串,但是String类 ...

  5. 17.Java常用实用类之String类中常用的方法以及一般应用场景,final关键字

    文章目录 1.String类学习 1.1.什么是String类 1.2.String类中常用的方法 1.2.1. 构造方法 1.2.2.public int length() 1.2.3.public ...

  6. 学习String类和日期Date类,看这一篇就够了

    写在前面,Java基础系列文章都是作者基于b站尚硅谷的Java基础视频所做的笔记,没有时间的同学可以认真看看,如果有时间的同学,还是建议看看视频,毕竟笔记说到底还是自己的东西,每个人的习惯也是不一样的 ...

  7. 将Fri May 04 17:25:34 CST 2012形式的日期字符串转换成java.util.Date对象的方法

    java.util.Date类的toString()方法默认生成"Fri May 04 17:25:34 CST 2012"形式的字符串,但从这样的字符串生成java.util.D ...

  8. 【Java 正则表达式】单字符匹配、预定字符、量词、Matcher(贪婪、勉强、独占模式)、捕获组、边界匹配符、String类与正则表达式

    正则表达式(Regex Expression) 字符串的合法验证 自己编写验证逻辑 使用正则表达式 单字符匹配 预定义字符 量词(Quantifier) Pattern.Matcher Matcher ...

  9. Lession10 常用类(正则表达式、Date Time结构、string类、Math类)

    Date Time结构: using System;namespace ConsoleApp1 //Date_Time_结构 {class Program{static void Main(strin ...

最新文章

  1. 扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?
  2. c语言左移15位,关于c语言中左移右移运算符的问题
  3. 怎么固定串口号_工业交换机的背板带宽怎么计算?
  4. Mahout快速入门教程
  5. mysql中局部变量说法正确的是_mysql全局变量和局部变量
  6. 网站前端组织冒泡事件
  7. TLS配置和流量分析实验
  8. TP5 急速上手 语法规则
  9. 域本地组,全局组,通用组的应用
  10. java实例属性_Java 静态属性与实例属性的初始化
  11. Datawhale 零基础入门数据挖掘-Task2 数据分析
  12. NUC1011 Financial Management【数学计算+水题】
  13. C语言32个关键字详解
  14. 解析.db文件,并且导出为sql语句
  15. CamTwist 3.4.3最新版(macOS 虚拟摄像头)
  16. 四元数、欧拉角及方向余弦矩阵的相互转换公式
  17. matlab如何实现波的叠加原理,什么是波的叠加原理?-王尚
  18. 30-40W/年,某银行招聘架构设计岗(地点:上海)
  19. ASP.NET 安全认证(二)【转】
  20. Python:实现counting sort计数排序算法(附完整源码)

热门文章

  1. 手机中的AR是怎么实现的
  2. 疫情之下,供应链金融的“危”与“机-转发
  3. SpringBoot - 统一格式封装及高阶全局异常处理
  4. Spring - @Conditional全解
  5. Apache Kafka-消费端_顺序消费的实现
  6. Spring OXM-XStream快速入门
  7. Translucent System Bars-4.4新特性
  8. 计算机虚拟化技术论文,【计算机网络论文】虚拟技术计算机网络论文(共1775字)...
  9. mysql地区时间_mysql – 带时区的日期时间格式
  10. html2Escape js 转义