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类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。的更多相关文章

  1. C#中的String类2

    深入C# String类 C#中的String类 他是专门处理字符串的(String),他在System的命名空间下,在C#中我们使用的是string 小写的string只是大写的String的一个别 ...

  2. 标准C++中的String类的使用

    要使用标准C++中的String类,必须包含#include<string>(注意不是<string.h>带.h的是C语言中的头文件) 作者:耑新新,发布于  博客园 转载请注 ...

  3. 标准C++中的string类的用法总结

    标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有 ...

  4. Java 中的 String 类常用方法

    字符串广泛应用在Java编程中,在Java中字符串属于对象,String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等. Strin ...

  5. JAVA中的String类(详解)

    Java.lang.String类是final类型的,因此不可以继承这个类.不能修改这个类.String是一个类不属于基本数据类型. 可以从源码中看到,String是一个final类型. String ...

  6. 关于Java中的String类知识点小总结

    Java中的String类知识点 前言 在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 如何创建字符串 最简单的方式 String str = "he ...

  7. STL中的string

    string常用函数 1.构造函数 string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 string类还支持默认构 ...

  8. 05-Java中的String类

    程序设计思路: 首先目标是使输入的字符串加上某个数变成另一个字符串,从而相当于对字符串进行加密. 第一步输入一个字符串String类型: 第二步把这个字符串转变成字符数组: 第三步让这个数组的每一个字 ...

  9. C++中的string类(1)

    http://blog.sina.com.cn/s/blog_51409e8f01009h7g.html 前言: string 的角色1 string 使用1.1 充分使用string 操作符1.2 ...

随机推荐

  1. Java笔记——循环语句

    Java笔记--循环语句     1. while语句 规律: 1. 首先计算表达式的值. 2. 若表达式为真,则执行循环语法,直至表达式为假,循环结束.   while(表达式) 语句; 例如: i ...

  2. 【C# 线程】 延迟初始化

    1. 简介 1.延迟初始化出现于.NET 4.0,主要用于提高性能,避免浪费计算,并减少程序内存要求.也可以称为,按需加载. 2.从net 4.0开始,C#开始支持延迟初始化,通过Lazy关键字,我们 ...

  3. 动态语言运行时(DLR)

    前言 为了让C#.Visual Basic等.NET编程语言能具备动态编程语言的特性,.NET 4.0引入了一个"DLR(Dynamic Language Runtime:动态语言运行时)& ...

  4. 45个 GIT 经典操作场景,专治不会合代码

    大家好,我是小富~ 技术交流关注公众号:程序员内点事 传送门:原文地址 git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户 ...

  5. android --一个简单的登录界面

    MainActivity.java package com.example.empty_project; import androidx.appcompat.app.AppCompatActivity ...

  6. VUE3 之 使用标签实现动画与过渡效果 - 这个系列的教程通俗易懂,适合新手

    1. 概述 巴纳姆效应告诉我们: 人们更容易相信笼统的.常见的人格描述,并觉得特别适合自己,认为该描述真实地反映了自己的人格面貌. 这也是所有算命先生的小把戏,算命先生通常把话说的很笼统,很通用,基本 ...

  7. AcWing 289. 环路运输

    传送门 思路: 一个环路上的问题,考虑拆环为链然后复制一倍接在后面.那么对于Ai与Aj,不妨设j<i,如果i-j>N/2则两者距离在新的链上就是i-j,而如果i-j<=N/2那么两者 ...

  8. 进程&线程(三):外部子进程subprocess、异步IO、协程、分布式进程

    1.外部子进程subprocess python之subprocess模块详解--小白博客 - 夜风2019 - 博客园 python subprocess模块 - lincappu - 博客园 之前 ...

  9. 串口通讯之rs232 c++版本

    rs232.cpp #ifndef kranfix_rs232_rs232_cc #define kranfix_rs232_rs232_cc #include "rs232.h" ...

  10. C#10新特性-lambda 表达式和方法组的改进

    C# 10 中对Lambda的语法和类型进行了多项改进: 1. Lambda自然类型 Lambda 表达式现在有时具有"自然"类型. 这意味着编译器通常可以推断出 lambda 表 ...