请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。
1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4 class String{
5 public:
6 //默认构造函数
7 String(const char* str=NULL);
8 //复制构造函数
9 String(const String &str);
10 //析构函数
11 ~String();
12 //字符串连接
13 String operator+(const String & str);
14 //字符串赋值
15 String & operator=(const String & str);
16 //字符串赋值
17 String & operator=(const char* str);
18 //判断字符串是否相等
19 bool operator==(const String & str);
20 //获取字符串长度
21 int length();
22 //求子字符串[start,start+-1]
23 String substr(int start,int n);
24 //重载输出
25 friend ostream & operator<<(ostream & o,const String & str);
26 private:
27 char * data;
28 int size;
29 };
30 //构造函数
31 String::String(const char *str){
32 if(str==NULL){
33 data=new char[1];
34 data[0]='\0';
35 size=0;
36 }else{
37 size=strlen(str);
38 data=new char[size+1];
39 strcpy(data,str);
40 }
41 cout<<str<<"构造"<<endl;
42 }
43 //复制构造函数
44 String::String(const String & str){
45 size=str.size;
46 data=new char[size+1];
47 cout<<str<<"拷贝"<<endl;
48 strcpy(data,str.data);
49 }
50 //析构函数
51 String::~String(){
52 delete[] data;
53 }
54 //字符串连接
55 String String::operator+(const String & str){
56 String newStr;
57 //释放原有空间
58 delete[] newStr.data;
59 newStr.size=size+str.size;
60 newStr.data=new char[newStr.size+1];
61 strcpy(newStr.data,data);
62 strcpy(newStr.data+size,str.data);
63 return newStr;
64 }
65 //字符串赋值
66 String & String::operator=(const String &str){
67 if(data==str.data){
68 return *this;
69 }
70 delete[] data;
71 size=str.size;
72 data=new char[size+1];
73 strcpy(data,str.data);
74 cout<<str<<"赋值"<<endl;
75 return *this;
76 }
77 //字符串赋值
78 String & String::operator=(const char* str){
79 if(data==str){
80 return *this;
81 }
82 delete[] data;
83 size=strlen(str);
84 data=new char[size+1];
85 strcpy(data,str);
86 cout<<str<<"赋值"<<endl;
87 return *this;
88 }
89 //判断是否字符串相等
90 bool String::operator==(const String &str){
91 return strcmp(data,str.data)==0;
92 }
93 //获取字符串长度
94 int String::length(){
95 return size;
96 }
97 //求子字符串[start,start+n-1]
98 String String::substr(int start,int n){
99 String newStr;
100 delete[] newStr.data;
101 newStr.data=new char[n+1];
102 for(int i=0;i<n;++i){
103 newStr.data[i]=data[start+i];
104 }
105 newStr.data[n]='\0';
106 newStr.size=n;
107 return newStr;
108 }
109 //重载输出
110 ostream & operator<<(ostream &o,const String & str){
111 o<<str.data;
112 return o;
113 }
114 int main(){
115 String str1("Hello ");
116 String str2=str1;
117 str2=str1;
118 return 0;
119 }
请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。的更多相关文章
- C#中的String类2
深入C# String类 C#中的String类 他是专门处理字符串的(String),他在System的命名空间下,在C#中我们使用的是string 小写的string只是大写的String的一个别 ...
- 标准C++中的String类的使用
要使用标准C++中的String类,必须包含#include<string>(注意不是<string.h>带.h的是C语言中的头文件) 作者:耑新新,发布于 博客园 转载请注 ...
- 标准C++中的string类的用法总结
标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...
- Java 中的 String 类常用方法
字符串广泛应用在Java编程中,在Java中字符串属于对象,String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等. Strin ...
- JAVA中的String类(详解)
Java.lang.String类是final类型的,因此不可以继承这个类.不能修改这个类.String是一个类不属于基本数据类型. 可以从源码中看到,String是一个final类型. String ...
- 关于Java中的String类知识点小总结
Java中的String类知识点 前言 在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 如何创建字符串 最简单的方式 String str = "he ...
- STL中的string
string常用函数 1.构造函数 string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 string类还支持默认构 ...
- 05-Java中的String类
程序设计思路: 首先目标是使输入的字符串加上某个数变成另一个字符串,从而相当于对字符串进行加密. 第一步输入一个字符串String类型: 第二步把这个字符串转变成字符数组: 第三步让这个数组的每一个字 ...
- C++中的string类(1)
http://blog.sina.com.cn/s/blog_51409e8f01009h7g.html 前言: string 的角色1 string 使用1.1 充分使用string 操作符1.2 ...
随机推荐
- 什么是jQuery?
目录 一:jQuery 1.jQuery介绍 2.jQuery的宗旨 3.有了jQuery那我们还使用BOM与DOM吗? 4.jQuery的优势 5.python与jQuery导入(复习) 6.jQu ...
- C语言中puts()和printf()区别
puts的功能更加单一,只能输出字符串:printf的功能更加广,可以格式化数据,输出多种类型的数据. puts()函数用来向标准输出设备(屏幕)写字符串并换行. 调用方式为puts(string): ...
- 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等
一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...
- Python 中的闭包和自由变量
1.定义 在函数内部再定义一个函数,并且这个函数用到了外部函数的变量(LEGB),最后返回新建函数的函数名索引,那么将这样的能够访问其定义时所在的作用域的函数以及用到的一些变量称之为闭包.被引用的非全 ...
- FTP服务器日志解析
转至:https://blog.csdn.net/weixin_34320724/article/details/92045244 FTP是老牌的文件传输协议,在网络中应用非常广泛.本节就Vsftp服 ...
- eclipse gradle创建java项目
参考: https://blog.csdn.net/weixin_33733810/article/details/92438913 一 : 需要在 https://gradle.org/releas ...
- 洛谷 简单字符串 'P1055ISBN号码' 问题
题目描述如下: 知识点①:char数组与int型数字进行运算时,需要将 char[i]-'0' .比如 char c[5]; int i; for(i=0;i<5;i++) scanf(&quo ...
- docker-docke安装和镜像仓库安装和管理
1.安装docker # yum install -y yum-utils device-mapper-persistent-data lvm2 # yum-config-manager \ --ad ...
- petite-vue源码剖析-双向绑定`v-model`的工作原理
前言 双向绑定v-model不仅仅是对可编辑HTML元素(select, input, textarea和附带[contenteditable=true])同时附加v-bind和v-on,而且还能利用 ...
- CodeReview规范
目标和原则 提高代码质量,及早发现潜在缺陷,降低修改/弥补缺陷的成本 促进团队内部知识共享,提高团队整体水平 评审过程对于评审人员来说,也是一种思路重构的过程,帮助更多的人理解系统 是一个传递知识的手 ...