#include <iostream>
#include <string>
using namespace std; class String
{
public:
String(const char* str = NULL);//通用构造函数,String("abc")
String(const String &str);//拷贝构造
~String(); String& operator=(const String &str);//赋值运算符。返回引用
String operator+(const String &str) const;
String& operator+=(const String &str);//+=操作符。返回引用
char& operator[](int n) const;//下标操作符。返回引用
bool operator==(const String &str) const; int size() const;//字符串实际大小,不包括结束符
const char *c_str() const;//将string转为char * private:
char *data;
int length;
}; String::String(const char* str)//通用构造
{
if (!str)
{//为空。String a()
length = ;
data = new char[];
*data = '\0';
}
else
{
length = strlen(str);
data = new char[length + ];
strcpy(data, str);//会拷贝源的结束符
}
} String::String(const String &str)//拷贝构造,深拷贝
{
length = str.size();
data = new char[length + ];
strcpy(data, str.c_str());
} String::~String()
{
delete[] data;
length = ;
} String& String::operator=(const String &str)//赋值操作符4步
{
if (this == &str) return *this;//1 自我赋值,返回自身引用 delete[] data;//2 删除原有数据 length = str.size();//3 深拷贝
data = new char[length + ];
strcpy(data, str.c_str()); return *this;//4 返回自身引用
}
String String::operator+(const String &str) const//+操作符3步
{//新建对象包括新空间,拷贝两个数据,返回新空间
String newString;
newString.length = length + str.size();
newString.data = new char[newString.length + ];
strcpy(newString.data, data);
strcat(newString.data, str.data);
return newString;
} String& String::operator+=(const String &str)//+=操作符5步
{//重分配新空间,拷贝两个数据,删除自己原空间,赋值为新空间,返回引用
length += str.size();//成员length是实际长度
char *newdata = new char[length + ];
strcpy(newdata, data);
strcat(newdata, str.c_str());
delete[] data;
data = newdata;
return *this;
} char& String::operator[](int n) const
{//下标操作符,返回引用
if (n >= length) return data[length - ];//如果越界,返回最后一个字符
else return data[n];
} bool String::operator==(const String &str) const
{
if (length != str.size()) return false;
return strcmp(data, str.c_str()) ? false : true;
} int String::size() const
{
return length;
} const char *String::c_str() const
{
return data;
} int main()
{
char a[] = "Hello", b[] = "World!";
String s1(a), s2(b);
cout << s1.c_str() << endl;
cout << s2.c_str() << endl;
s1 += s2;
cout << s1.c_str() << endl;
s1 = s2;
cout << s1.c_str() << endl;
cout << (s1 + s2).c_str() << endl;
cout << s1.size() << endl;
cout << s1[] << endl; if (s1 == s2)
cout << "相等" << endl;
}

c++简单String类实现的更多相关文章

  1. 自己实现简单的string类

    1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C ...

  2. C++ char数组和string类简单使用总结

    使用char数组,进行字符串的操作,是c风格的操作方式. string是C++的风格,感觉string本质上就是一个vector<char> 以下代码详细展示了字符串的常见操作 #incl ...

  3. c++string类的简单介绍

    #include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...

  4. 一个简单实现的string类

    为了复习c++知识,简单的实现一个string类,类名为CMyString 环境说明:windows 7 64位 和 CentOS Linux release 7.6.1810 (Core) 开发工具 ...

  5. 实现C++标准库string类的简单版本

    代码如下: #ifndef STRING_H #define STRING_H #include <cassert> #include <utility> #include & ...

  6. 实现简单的string类

    摘要 实现了一个string类,包括基本的构造.赋值.判断.大小写等. String API Constructors string(); string(const char& ch); st ...

  7. Java api 入门教程 之 JAVA的String 类

    1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s = “Java语 ...

  8. String类replaceAll方法正则替换深入分析

    作者网址: https://my.oschina.net/shipley/blog/98973 背景:      前几天有人发了一个关于下面问题的贴,对这个有点好奇,故花时间做了点研究.       ...

  9. 关于如何来构造一个String类

    今天帮着一位大二的学弟写了一个String的类,后来一想这个技术点,也许不是什么难点,但是还是简单的记录一些吧! 为那些还在路上爬行的行者,剖析一些基本的实现..... 内容写的过于简单,没有涉及到其 ...

随机推荐

  1. php与js互相调用

    php中调用js <?php echo '<script>var yearid=$("#yearId").val()</script>'; echo ...

  2. 五. jenkins部署springboot项目(2)--windows环境--服务

    前提:jenkins和springboot运行在同一台机器 springboot 通过winsw部署为服务 winsw 下载地址:https://github.com/kohsuke/winsw/re ...

  3. js中Object.defineProperty()方法的解释

    菜菜: “老大,那个, Object.defineProperty 是什么鬼?” 假设我们有个对象 user ; 我们要给它增加一个属性 name , 我们会这么做 1 2 3 var user = ...

  4. docker调用yum时“"/usr/libexec/urlgrabber-ext-down" is not installed”

    原因: 1 docker镜像为高版本的fedora30:latest镜像,yum本身已被dnf替代,但部分功能仍不完整: 如:yum-builddep SPECS/xxx.spec 解决办法: 1 安 ...

  5. DNS 放大

    DNS放大攻击是伪造一个DNS查询的报文,源地址改成想要攻击的IP.单个查询的包64字节,如果是ANY类型查询(或者DNSSEC记录),那么回复报文一般会大几十倍.当然,如果攻击者自己制造一个很大的T ...

  6. HDU 3571 N-dimensional Sphere( 高斯消元+ 同余 )

    N-dimensional Sphere Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  7. windows 如何配置 Go 环境(Zip archive 方式)?

    windows 如何配置 Go 环境(Zip archive 方式)? 下载地址:https://dl.google.com/go/go1.12.5.windows-amd64.zip 解压 go1. ...

  8. maven上传源码脚本

    mvn deploy:deploy-file -Dmaven.test.skip=true -Dfile=./target/bbc-common-1.0.0-source.jar -DgroupId= ...

  9. mysql中级操作

    解析sql执行过程 show VARIABLES like '%profil%' //查看是否开启了剖析 如没开启set profiling=1; 启用 show profiles; set @que ...

  10. 第二则java读取excel文件代码

    // 得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全 String savePath = this.getServletContext().ge ...