我们结合运算符重载知识实现string 类

在自己实现的String类中可以参考C++中string的方法

例如构造,加法,大小比较,长度,[] 等操作.

当前的MyString 类中,暂时不加入迭代器,我们将在下一节中加入迭代器的代码.

#include <iostream>
using namespace std; class MyString { public: //构造函数
MyString(const char * pSource = nullptr) {
if (pSource != nullptr) {
pString = new char[strlen(pSource) + 1];
strcpy(pString, pSource);
}
else {
pString = new char[1];
pString[0] = '\0';
}
cout << "MyString构造函数,对象地址="<<this << endl;
} //拷贝构造
MyString(const MyString & _rValue) { pString = new char[strlen(_rValue.pString) + 1];
strcpy(pString, _rValue.pString);
cout << "MyString拷贝构造函数" << endl;
} //赋值函数
MyString & operator=(const MyString & _rValue) { if (this == &_rValue) {
return *this;
}
delete[] this->pString;
this->pString = nullptr; char * _tpString = new char[strlen(_rValue.pString) + 1];
strcpy(_tpString, _rValue.pString); cout << "MyString赋值函数" << endl; } //可编辑
char & operator[](int index) { int len = strlen(this->pString);
if (index<0) { return pString[0]; }
else if (index>len) { return pString[index]; }
else { return pString[index]; } } //不可编辑
const char operator[](int index) const { int len = strlen(this->pString);
if (index<0) { return pString[0]; }
else if (index>len) { return pString[index]; }
else { return pString[index]; } } bool operator>(const MyString & _rValue) const {
return strcmp(this->pString, _rValue.pString)>0;
}
bool operator<(const MyString & _rValue) const {
return strcmp(this->pString, _rValue.pString)<0;
}
bool operator==(const MyString & _rValue) const {
return strcmp(this->pString, _rValue.pString)==0;
} int length() const {
return strlen(this->pString);
} ~MyString() {
if (this->pString != nullptr) {
delete[] this->pString;
this->pString = nullptr;
cout << "MyString析构函数" << this << endl;
}
} const char * c_str() const { return this->pString; } private:
char * pString ;
friend MyString operator+ (const MyString & s1, const MyString &s2) ;
friend ostream & operator<<(ostream & out, const MyString &s) ; }; MyString operator+(const MyString & s1, const MyString &s2) { /*
方式1 这段代码有 内存泄漏问题 tp 没有释放掉
int newLength = strlen(s1.pString) + strlen(s2.pString) + 1;
char *tp = new char[newLength + 1];//重新申请空间
strcpy(tp, s1.pString);
strcat(tp, s2.pString); MyString s(tp);
cout << "operator+ = " << &s << endl;
return s;
*/ /*
方式2 对比方式1 效果更高
*/
MyString s;
int newLength = strlen(s1.pString) + strlen(s2.pString) + 1;
s.pString = new char[newLength + 1];//重新申请空间
strcpy(s.pString, s1.pString);
strcat(s.pString, s2.pString);
cout << "operator+ = " << &s << endl;
return s;
} ostream & operator<<(ostream & out, const MyString &s) {
cout << s.pString << endl;
return out;
} void test() { MyString s1("12345");
MyString s2("6789ABC"); cout << s1 << endl;
cout << s2 << endl; MyString s3 = s1 + s2;
cout << s3 << endl;
cout << "s3 = " << &s3 << endl; for (int i = 0; i < s3.length(); i++) {
cout << s3[i] << endl;
} cout <<"--------------------" << endl;
s3[0] = 'W';
for (int i = 0; i < s3.length(); i++) {
cout << s3[i] << endl;
} const MyString s4("hello"); for (int i = 0; i < s4.length(); i++) {
cout << s4[i] << endl;
} }
int main() { test(); system("pause");
return 0;
}

<二>自己实现简单的string的更多相关文章

  1. 二维码简单Demo

    二维码简单Demo 一.视图 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name=&qu ...

  2. kafka原理和实践(二)spring-kafka简单实践

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  3. APS.NET MVC4生成解析二维码简单Demo

    一.视图 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewpor ...

  4. MongoDB学习:(二)MongoDB简单使用

    MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...

  5. linux设备驱动归纳总结(十二):简单的数码相框【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-116926.html linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxx ...

  6. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  7. 实验二:MAL——简单后门 by:赵文昊

    实验二:MAL--简单后门 一.后门是什么? 哪里有后门呢? 编译器留后门 操作系统留后门 最常见的当然还是应用程序中留后门 还有就是潜伏于操作系统中或伪装为特定应用的专用后门程序. 二.认识netc ...

  8. spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略

    spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略 某电子商务网站在一个黑色星期五 ...

  9. phpqrcode生成动态二维码简单实例

    这是一个利用phpqrcode生成动态二维码简单实例,比微信官方提供的接口还要好用.二维码是动态的,不用生成图片,可自定义二维码大小,间隙,跳转地址等. 参数设置: include_once 'php ...

  10. pytho创建二维码简单版

    pytho创建二维码简单版 import qrcode aa = qrcode.make("https://github.com/phygerr/") aa.save('C:\Us ...

随机推荐

  1. KingabseES 锁机制

    KingabseES的锁机制 目录 KingabseES的锁机制 一.前言 二.锁机制 三.表级锁 ( Table-Level Locks ) 1.访问共享(ACCESS SHARE) 2.行共享(R ...

  2. ElasticSearch介绍和基本用法(一)

    ElasticSearch 引言 1.在海量数据中执行搜索功能时,如果使用MySQL, 效率太低. 2.如果关键字输入的不准确,一样可以搜索到想要的数据. 3.将搜索关键字,以红色的字体展示. 介绍: ...

  3. (数据科学学习手札141)利用Learn Git Branching轻松学习git常用操作

    1 简介 大家好我是费老师,Git作为世界上最流行的版本控制系统,可以说是每一位与程序打交道的朋友最值得学习的软件之一.除了管理自己的项目,如果你对参与开源项目感兴趣,那么Git更是联结Github. ...

  4. 如何搭建安全的 CI/CD 管道?

    Eolink 前端负责人黎芷君进行了<工程化- CI / CD>的主题演讲,围绕 CI/CD 管道安全的实践,分享自己在搭建 CI/CD 管道过程中所总结的重要经验,与开发者深入讨论 &q ...

  5. Fluentd 使用 multiline 解析器来处理多行日志

    转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247500439&idx=1&sn=45e9e0e0ef ...

  6. ProxySQL(10):读写分离方法论

    文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9318558.html 不同类型的读写分离 数据库中间件最基本的功能就是实现读写分离,ProxySQL当然也支 ...

  7. Elasticsearch集群规模和容量规划的底层逻辑

    转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484628&idx=1&sn=666e416ae ...

  8. 第二章:视图层 - 7:HttpResponse对象

    类定义:class HttpResponse[source] HttpResponse类定义在django.http模块中. HttpRequest对象由Django自动创建,而HttpRespons ...

  9. (WebFlux)004、WebFilter踩坑记录

    一.背景 使用SpringWebFlux的WebFilter时,由于不熟悉或一些思考疏忽,容易出现未知的异常.记录一下排查与解决方案,给大家分享一下. 二.问题 2.1 问题描述 在测试接口方法时,出 ...

  10. Javascript 手写 LRU 算法

    LRU 是 Least Recently Used 的缩写,即最近最少使用.作为一种经典的缓存策略,它的基本思想是长期不被使用的数据,在未来被用到的几率也不大,所以当新的数据进来时我们可以优先把这些数 ...