http://blog.csdn.net/randyjiawenjie/article/details/6709539

C++实现String类,还没有完成,待继续。

有以下注意的点:

(1)赋值操作符返回的是一个MyString&,而重载的+返回的是一个MyString。其中的原因参看《effective c++》,主要是返回引用的时候,必须返回必须在此函数之前存在的引用,因为引用是一个名字,“在我们使用之前,必须想想他代表了那个名字“。如果返回了一个局部对象的引用,那么这个函数结束后,这个引用就会指向一个不存在的对象,显然,这是走上了行为未定义的快车道。

[cpp] view plain copy
  1. # include <iostream>
  2. # include <memory>
  3. # include <cstring>
  4. using namespace std;
  5. class MyString {
  6. private:
  7. char *m_data;
  8. public:
  9. MyString();
  10. MyString(const char* ptr);
  11. MyString(const MyString& rhs);
  12. ~MyString();
  13. MyString& operator=(const MyString& rhs);
  14. MyString operator+(const MyString& rhs);
  15. char operator[](const unsigned int index);
  16. bool operator==(const MyString& rhs);
  17. friend ostream& operator<<(ostream& output, const MyString &rhs);
  18. };
  19. //默认的构造函数
  20. MyString::MyString() {
  21. m_data = new char[1];
  22. *m_data = '\0';
  23. }
  24. //使用const char* 来初始化
  25. MyString::MyString(const char* ptr) {
  26. if (NULL == ptr) {
  27. m_data = new char[1];
  28. *m_data = '\0';
  29. } else {
  30. int len = strlen(ptr);
  31. m_data = new char[len + 1];
  32. strcpy(m_data, ptr);
  33. }
  34. }
  35. //拷贝构造函数
  36. MyString::MyString(const MyString& rhs) {
  37. int len = strlen(rhs.m_data);
  38. m_data = new char[len + 1];
  39. strcpy(m_data, rhs.m_data);
  40. }
  41. bool MyString::operator ==(const MyString& rhs) {
  42. int result = strcmp(m_data, rhs.m_data);
  43. if (0 == result)
  44. return true;
  45. else
  46. return false;
  47. }
  48. //赋值操作符
  49. MyString& MyString::operator =(const MyString& rhs) {
  50. if (this != &rhs) {
  51. delete[] m_data;
  52. m_data = new char[strlen(rhs.m_data) + 1];
  53. strcpy(m_data, rhs.m_data);
  54. }
  55. return *this;
  56. }
  57. //重载运算符+
  58. MyString MyString::operator+(const MyString &rhs) {
  59. MyString newString;
  60. if (!rhs.m_data)
  61. newString = *this;
  62. else if (!m_data)
  63. newString = rhs;
  64. else {
  65. newString.m_data = new char[strlen(m_data) + strlen(rhs.m_data) + 1];
  66. strcpy(newString.m_data, m_data);
  67. strcat(newString.m_data, rhs.m_data);
  68. }
  69. return newString;
  70. }
  71. //重载下标运算符
  72. char MyString::operator [](const unsigned int index) {
  73. return m_data[index];
  74. }
  75. //析构函数
  76. MyString::~MyString() {
  77. delete[] m_data;
  78. }
  79. //重载<<
  80. ostream& operator<<(ostream& output, const MyString &rhs) {
  81. output << rhs.m_data;
  82. return output;
  83. }
  84. int main() {
  85. const char* p = "hello,world";
  86. MyString s0 = "hello,world";
  87. MyString s1(p);
  88. MyString s2 = s1;
  89. MyString s3;
  90. s3 = s1;
  91. MyString s4 = s3 + s1;
  92. bool flag(s1 == s2);
  93. cout << s0 << endl;
  94. cout << s1 << endl;
  95. cout << s2 << endl;
  96. cout << s3 << endl;
  97. cout << flag << endl;
  98. char result = s3[1];
  99. cout << result << endl;
  100. cout << s4 << endl;
  101. return 0;
  102. }

运行结果:

hello,world
hello,world
hello,world
hello,world
1
e
hello,worldhello,world

C++实现String类相关推荐

  1. C++ 笔记(22)— STL string 类(字符串赋值、访问、拼接、查找、翻转、大小写转换)

    1. 实例化和赋值 STL string #include <string> #include <iostream>int main () {using namespace s ...

  2. java string改变的影响_为什么Java的string类要设成immutable(不可变的)

    最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...

  3. C++——String类超详细介绍

    (欢迎及时指正错误!谢谢) STL的含义:标准模板库 STL的内容: 容器:数据的仓库 算法:与数据结构相关的算法.通用的算法(和数据结构无关) 注:熟悉常用的算法 sort  reverse 迭代器 ...

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

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  5. c++ string replace_JAVA应用程序开发之String类常用API

    [本文详细介绍了JAVA应用开发中的String类常用API,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 API ( Application Interface 应用程序接口)是类中提供的接口, ...

  6. javascript:为string类添加三个成员,实现去左,右,及所有空格

    <script language="JavaScript">    //此处为string类添加三个成员    String.prototype.Trim = func ...

  7. 字符串(string类)

    [1]String类基本函数如何实现? 示例代码如下: 1 #include<iostream> 2 #include<assert.h> 3 #include<stri ...

  8. 交换变量和String类初始化:JAVA入门基础

    本文主要介绍了变量交换.String类初始化.字符串的基本操作.变量交换详解介绍了两个变量是如何交换的,通过例子理解这个用法. 一.交换变量 1.什么是交换变量 例如用户输入a.b的值分别3,9的整数 ...

  9. 带你进入String类的易错点和底层本质分析!

    来源:https://my.oschina.net/liboware/blog/5076245 字符串拼接及创建的案例分析 案例一 String a = "test"; Strin ...

  10. string类具体用法

    string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...

最新文章

  1. ecs服务器配置git_基于ECS和NAS搭建个人网盘
  2. 在java中 接口修饰符,Java接口中的修饰符
  3. php 面向对象 教程,PHP学习笔记之面向对象设计_PHP教程
  4. Spring与Rails的jQuery UJS
  5. mysql char(36)_MySQL中char(36)被认为是GUID导致的BUG及解决方案
  6. Spark源码分析之Master注册机制原理
  7. rose顺序图转换为协作图_如何用GX Developer编程软件编写SFC顺序功能图?
  8. magento邮件使用php,用Magento的Email模板机制发邮件
  9. js面向对象编程(三)非构造函数的继承(转载)
  10. 关于特征筛选中的IV值
  11. exosip鉴权及使用
  12. UI设计技巧|PS实现照片水彩画效果
  13. 网络基础该从哪开始补?这36张图,一次性理清
  14. 什么是Android SDK
  15. 鸿蒙第三代手机,原创 荣耀Magic 3最新确认,鸿蒙系统+双6400万,最期待的荣耀来了...
  16. Mac m1 安装php redis扩展
  17. UIQ来电监听挂断原理和代码
  18. Python for everyone chapter 1
  19. 百度适配代码【移动搜索】如何让百度正确识别跳转适配关系
  20. 视频直播软件开发关于亚马逊s3接入方式,视频直播源码创建存储桶方法

热门文章

  1. vs xxxxx nuget配置无效
  2. 010-python基础-数据类型-字符串操作
  3. Jade之Extends
  4. Android PreferenceActivity 使用
  5. java 李刚 pdf_Java数据库技术详解(李刚) PDF_源雷技术空间
  6. pyqt开发的程序模板_小程序定制开发和模板开发要多少钱?有什么区别?
  7. c mysql二进制,MySQL运用connector C/C+读取二进制字段
  8. java文本框双击可编辑_java swing 文本域双击变为可编辑
  9. git 忽略 部分文件夹_git设置忽略文件和目录
  10. arm板telnetd为什么运行不了_一种基于ARM的嵌入式系统开发的方案详细讲解