string.h

  1. #pragma once
  2.  
  3. class string
  4. {
  5. public:
  6. string(const char* str = nullptr);
  7. string(const string& str);
  8. ~string();
  9.  
  10. string& operator=(const string& str);
  11. string& operator+=(const string& str);
  12. char& operator[](int n) const;
  13. char& operator[](int n);
  14. bool operator==(const string& str) const;
  15.  
  16. int size() const;
  17. const char* c_str() const;
  18. bool empty() const;
  19.  
  20. friend const string operator+(const string& lhs, const string& rhs);
  21. private:
  22. char *data;
  23. int length;
  24. };

string.cpp

  1. #include "string.h"
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. const string operator+(const string& lhs, const string& rhs)
  6. {
  7. string tmp(lhs);
  8. tmp += rhs;
  9. return tmp;
  10. }
  11.  
  12. string::string(const char * str)
  13. {
  14. if (!str)
  15. {
  16. length = ;
  17. data = new char[];
  18. *data = '\0';
  19. }
  20. else
  21. {
  22. length = strlen(str);
  23. data = new char[length + ];
  24. strcpy(data, str);
  25. }
  26. printf("string constructor\n");
  27. }
  28.  
  29. string::string(const string & str)
  30. {
  31. length = str.size();
  32. data = new char[length + ];
  33. strcpy(data, str.c_str());
  34. printf("string copy constructor\n");
  35. }
  36.  
  37. string::~string()
  38. {
  39. length = ;
  40. delete[] data;
  41. printf("string destructor\n");
  42. }
  43.  
  44. string& string::operator=(const string & str)
  45. {
  46. if (this == &str)
  47. return *this;
  48. delete[] data;
  49.  
  50. length = str.size();
  51. data = new char[length + ];
  52. strcpy(data, str.c_str());
  53.  
  54. return *this;
  55. }
  56.  
  57. string & string::operator+=(const string & str)
  58. {
  59. length += str.size();
  60. char *newdata = new char[length + ];
  61. strcpy(newdata, data);
  62. strcat(newdata, str.c_str());
  63. delete[] data;
  64. data = newdata;
  65. return *this;
  66. }
  67.  
  68. char& string::operator[](int n) const
  69. {
  70. return data[n];
  71. }
  72.  
  73. char& string::operator[](int n)
  74. {
  75. return data[n];
  76. }
  77.  
  78. bool string::operator==(const string & str) const
  79. {
  80. if (length != str.size())
  81. return false;
  82. return strcmp(data, str.c_str()) ? false : true;
  83. }
  84.  
  85. int string::size() const
  86. {
  87. return length;
  88. }
  89.  
  90. const char * string::c_str() const
  91. {
  92. return data;
  93. }
  94.  
  95. bool string::empty() const
  96. {
  97. return length == ;
  98. }

main.cpp

  1. #include"string.h"
  2.  
  3. int main()
  4. {
  5. char a[] = "hello", b[] = "world";
  6. string s1(a), s2(b);
  7. string s3 = s1 + s2;
  8. return ;
  9. }

string的+运算符重载进行了返回值优化,在Visual Studio Release模式下main函数中会调用两次构造函数、一次复制构造函数、一次析构函数,比起不做优化减少了一次构造函数和一次析构函数

  1. string constructor
  2. string constructor
  3. string copy constructor
  4. string destructor
  5. string destructor
  6. string destructor

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

  1. ASP.NET - Web API,从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法

    一,简单类型的传值 比如 public Users Get(int id) ,它可以使用两种方式获取: api/default/ $.get("/api/default",{id: ...

  2. 从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法

    一,简单类型的传值   比如 public Users Get(int id) ,它可以使用两种方式获取:   api/default/5 $.get("/api/default" ...

  3. c++简单String类实现

    #include <iostream> #include <string> using namespace std; class String { public: String ...

  4. STL基础--String

    String 构造 string s1("Hello"); string s2("Hello", 3); //s2: Hel string s3(s1, 2); ...

  5. cstring 转 string

    都通过基本类型来转换即可:CString可以转换为基本类型LPCTSTR,LPCTSTR根据项目编码可以是const char*或者const wchar_t*:string可以用c_str()转换为 ...

  6. 第一节: Redis之String类型和Hash类型的介绍和案例应用

    一. String类型基础 1.类型介绍 典型的Key-Value集合,如果要存实体,需要序列化成字符串,获取的时候需要反序列化一下. 2. 指令Api说明 3.常用Api说明 (1).StringS ...

  7. IL异常处理

    异常处理在程序中也算是比较重要的一部分了,IL异常处理在C#里面实现会用到一些新的方法 1.BeginExceptionBlock:异常块代码开始,相当于try,但是感觉又不太像 2.EndExcep ...

  8. python leetcode 1

    开始刷 leetcode, 简单笔记下自己的答案, 目标十一结束之前搞定所有题目. 提高一个要求, 所有的答案执行效率必须要超过 90% 的 python 答题者. 1. Two Sum. class ...

  9. JavaScript常用对象的方法和属性

    ---恢复内容开始--- 本文将简单介绍JavaScript中一些常用对象的属性和方法,以及几个有用的系统函数. 一.串方法 JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩 ...

随机推荐

  1. Jmeter:运行报:Error occurred starting thread group :线程组, error message:Invalid duration 0 set in Thread Group:线程组, see log file for more details

    最近在用jmeter做压测,上周五压测的脚本,今天早晨结束后. 点击同样的脚本,运行就报Error occurred starting thread group :线程组, error message ...

  2. python学习笔记(二)---for循环与操作列表

    内容概要 for循环 range(start,end,step)函数 生成随机数列表 list()函数 将range()的结果整合到某个列表 列表的操作 切片(start: end :step) 元组 ...

  3. Nginx四层代理

    Nginx支持四层代理 http://nginx.org/en/docs/stream/ngx_stream_core_module.html 该ngx_stream_core_module模块自1. ...

  4. 利用requests, beautifulsoup包爬取股票信息网站

    这是第一次用requests, beautifulsoup实现爬虫,此次爬取的是一个股票信息网站:http://www.gupiaozhishi.net.cn. 实现非常简单,只是为了demo使用的数 ...

  5. JavaScript HTMlL DOM对象(上)

    Dom:document.相当于把所有的html文件,转换成了文档对象. 之前说过:html-裸体的人:css-穿上衣服:js-让人动起来. 让人动起来,就得先找到他,再修改它内容或属性. 找到标签 ...

  6. Flutter自己实现一个ProgressHUD

    用惯了iOS的SVProgressHUD,但是在flutter pub上的并没有找到类似的实现,于是自己实现一个 主要实现四个基本功能 Loading显示 成功显示 错误显示 进度显示:环形进度条和文 ...

  7. LightOJ 1287 Where to Run(期望)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1287 题意:给定一个n个点的无向图(0到n-1),你开始在0.你开始遍历这个图 ...

  8. 《LabVIEW 虚拟仪器程序设计从入门到精通(第二版)》一1.3 小结

    本节书摘来自异步社区<LabVIEW 虚拟仪器程序设计从入门到精通(第二版)>一书中的第1章,第1.3节,作者 林静 , 林振宇 , 郑福仁,更多章节内容可以访问云栖社区"异步社 ...

  9. vscode快捷替换json格式

    i=json from=AUTO to=AUTO smartresult=dict client=fanyideskweb salt=1537359261311 sign=06b7d1398ebdc6 ...

  10. 用 GitHub Action 构建一套 CI/CD 系统

    ​ 缘起 Nebula Graph 最早的自动化测试是使用搭建在 Azure 上的 Jenkins,配合着 GitHub 的 Webhook 实现的,在用户提交 Pull Request 时,加个 r ...