第八天2017/04/17(2、❤String类的源代码)
改进版本: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类的源代码)相关推荐
- 第八天2017/04/17(3、C++的几个语法)
1. 必须用成员初始化列表的三种形式: const成员 引用成员 C++编译器不知道如何构造某个类 #include <iostream> using namespace std; cla ...
- 第八天2017/04/17(1、拷贝构造、❤临时对象)
调用拷贝构造函数的三种case 1. MyPoint p2 = p1; MyPoint p2(p1);case1中的重点:MyPoint p3 = MyPoint(3,3); //此时:C++编译器进 ...
- 04 能够使用String类常用方法操纵字符串 0214
04 能够使用String类常用方法操纵字符串 0214 1 2 3 4
- java/04/String类的特点,String的常用方法,this关键字
java/04/String类的特点,String的常用方法,this关键字 String 是一个字符串类型的类,使用"""双引号定义的内容都是字符串,但是String类 ...
- 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 ...
- 学习String类和日期Date类,看这一篇就够了
写在前面,Java基础系列文章都是作者基于b站尚硅谷的Java基础视频所做的笔记,没有时间的同学可以认真看看,如果有时间的同学,还是建议看看视频,毕竟笔记说到底还是自己的东西,每个人的习惯也是不一样的 ...
- 将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 ...
- 【Java 正则表达式】单字符匹配、预定字符、量词、Matcher(贪婪、勉强、独占模式)、捕获组、边界匹配符、String类与正则表达式
正则表达式(Regex Expression) 字符串的合法验证 自己编写验证逻辑 使用正则表达式 单字符匹配 预定义字符 量词(Quantifier) Pattern.Matcher Matcher ...
- Lession10 常用类(正则表达式、Date Time结构、string类、Math类)
Date Time结构: using System;namespace ConsoleApp1 //Date_Time_结构 {class Program{static void Main(strin ...
最新文章
- 扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?
- c语言左移15位,关于c语言中左移右移运算符的问题
- 怎么固定串口号_工业交换机的背板带宽怎么计算?
- Mahout快速入门教程
- mysql中局部变量说法正确的是_mysql全局变量和局部变量
- 网站前端组织冒泡事件
- TLS配置和流量分析实验
- TP5 急速上手 语法规则
- 域本地组,全局组,通用组的应用
- java实例属性_Java 静态属性与实例属性的初始化
- Datawhale 零基础入门数据挖掘-Task2 数据分析
- NUC1011 Financial Management【数学计算+水题】
- C语言32个关键字详解
- 解析.db文件,并且导出为sql语句
- CamTwist 3.4.3最新版(macOS 虚拟摄像头)
- 四元数、欧拉角及方向余弦矩阵的相互转换公式
- matlab如何实现波的叠加原理,什么是波的叠加原理?-王尚
- 30-40W/年,某银行招聘架构设计岗(地点:上海)
- ASP.NET 安全认证(二)【转】
- Python:实现counting sort计数排序算法(附完整源码)
热门文章
- 手机中的AR是怎么实现的
- 疫情之下,供应链金融的“危”与“机-转发
- SpringBoot - 统一格式封装及高阶全局异常处理
- Spring - @Conditional全解
- Apache Kafka-消费端_顺序消费的实现
- Spring OXM-XStream快速入门
- Translucent System Bars-4.4新特性
- 计算机虚拟化技术论文,【计算机网络论文】虚拟技术计算机网络论文(共1775字)...
- mysql地区时间_mysql – 带时区的日期时间格式
- html2Escape js 转义