一、答案

#include <iostream>
#include <string.h>
#include <assert.h>class String
{
public:String(const char *str = nullptr);String(const String &other);~String(void);String &operator=(const String &other);bool operator==(const String &str);char *Stringcpy(char *dst, const char *src);friend std::ostream &operator<<(std::ostream &o, const String &str);private:char *m_data;
};String::String(const char *str)
{if (str == nullptr){m_data = new char[1];*m_data = '\0';}else{int len = strlen(str);m_data = new char[len + 1];Stringcpy(m_data, str);}
}
String::~String(void)
{delete[] m_data;
}String::String(const String &other)
{int len = strlen(other.m_data);m_data = new char[len + 1];Stringcpy(m_data, other.m_data);
}
char *String::Stringcpy(char *dst, const char *src)
{assert(dst != nullptr);assert(src != nullptr);char *ret = dst;while ((*dst++ = *src++) != '\0');return ret;
}
String &String::operator=(const String &other)
{if (this == &other)return *this;String tmp(other);char *p = tmp.m_data;tmp.m_data = m_data;m_data = p;return *this;
}bool String::operator==(const String &str)
{return strcmp(m_data, str.m_data) == 0;
}std::ostream &operator<<(std::ostream &o, const String &str)
{o << str.m_data;return o;
}int main()
{String s = "hello";String s2 = s;String ss = "hello";std::cout << "s = " << s << std::endl;std::cout << "s2 = " << s2 << std::endl;std::cout << std::boolalpha << (ss == s) << std::endl;return 0;
}

二、其他

这里面有个考点,就是赋值构造函数的写法。传统的写法可能如下:

String &String::operator=(const String &other)
{if (this == &other)return *this;delete[] m_data;int len = strlen(other.m_data);m_data = new char[len + 1];Stringcpy(m_data, other.m_data);return *this;
}

这种写法能够很好的完成功能,但是问题在于如果 new char 时如果系统内容不足的话就会抛出异常,此时因为上一句代码已经将 m_data 释放掉了,所以此时的 String 实例就是异常的。就算外面已经做好异常处理,String 实例已经是不能再用的了。

解决这个问题的方案可以是将 new char 放置到 delete 的前面,这样就算抛出了异常也不会造成 String 实例的异常。

另外一种方案就是上面答案中的方法,巧妙的是不仅可以解决上述问题,还可以通过临时变量退出当前上下文时自动释放内存的方式释放掉之前的字符串。

参考:https://blog.csdn.net/qq_31558353/article/details/50788843

(SAW:Game Over!)

Cpp / std::string 实现相关推荐

  1. ATL::CStringA和std::string之间转换的一些误区

    对于刚做windows下VC的开发同学,类型转换应该是一个令其很苦恼的问题.我刚写工作的时候,也为这类问题不停的在网上搜索转换方法.最近工作中遇到一个"神奇"的bug(一般&quo ...

  2. std::string的find问题研究

    https://files-cdn.cnblogs.com/files/aquester/std之string的find问题研究.pdf 目录 目录 1 1. 前言 1 2. find字符串 1 3. ...

  3. QString与std::string的相互转换

    QString与std::string的相互转换 原创 2014年07月07日 16:25:53 4011 [cpp] view plain copy //1 QString与int相互转换 QStr ...

  4. std::string的拷贝赋值研究

    说明:以下涉及的std::string的源代码摘自4.8.2版本. 结论:std::string的拷贝复制是基于引用计数的浅拷贝,因此它们指向相同的数据地址. // std::string类定义 ty ...

  5. 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)

    标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象 ...

  6. C++ 标准程序库std::string 详解

    现在一般不再使用传统的char*而选用C++标准程序库中的string类,是因为string标准程序和char*比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个类出现,集成的操作函数足以完 ...

  7. std::string::assign 崩溃的问题

    最近遇到了一个assign 崩溃的问题, 代码的话 其实就是去assign,莫名其妙就崩溃,是在一个自动化测试的时候发生的,可能手动测试的时候不会发现! 猜了一下里面的assign的逻辑,基本是这样的 ...

  8. std::string::substr

    std::string::substr Defined in header <string> - 定义于头文件 <string> public member function ...

  9. linux c 字符串转int,Linux c/c+编程--std::string str; int转str

    1, 首先在使用std::string 时,需要include 哪个文件? 需要区分#include 和 #include #include 声明的是C语言的字符串处理函数,例如strcpy, str ...

最新文章

  1. RabicMQ基本概念
  2. 搭建JAVA可视化开发环境
  3. Android开发之2048安卓版
  4. 成功解决ValueError: Parameter values for parameter (n_estimators) need to be a sequence.
  5. ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)
  6. php 导出excel 汉字乱码问题
  7. Hibernate知识点总结
  8. python语言format用法_format()函数的定义和用法总结
  9. 【Android多媒体】Android5.0 NuPlayer多媒体框架【1】
  10. thinkphp漏洞_【组件攻击链】ThinkCMF 高危漏洞分析与利用
  11. JAVA蓝桥杯基础练习 Fibonacci数列
  12. 高仿网易评论列表效果之界面生成
  13. win7系统下C盘扩容
  14. [JS]Tue Feb 01 2022 000000 GMT+0800 (中国标准时间) 日期格式化
  15. 安卓桌面软件_Windows启动器v8.34安卓用上win桌面
  16. Android Studio 录屏/电脑实时显示手机的画面
  17. 【转】现学现用WPS,小技巧大帮助
  18. 各种说明方法的答题格式_说明方法的作用答题格式
  19. java大作业用jsp数据库java_JSP数据库大作业 - 不是太阳也要发光的个人页面 - OSCHINA - 中文开源技术交流社区...
  20. What is Culture Shock?

热门文章

  1. mysql安装sphinx引擎
  2. 做Mysql主从时,注意使用replicate_wild_do_table和replicate-wild-ignore-table
  3. “读书”频道的一些链接错误
  4. springboot下使用mybatis配置
  5. 关于Excel和Csv导入和导出工具使用
  6. js小案例:定时轮播图
  7. hdfs restful API:httpfs与webhdfs的简单使用
  8. Spring Boot 2.3.x 分层构建 Docker 镜像实战
  9. Redis开发:hash存储自定义Java对象及value的序列化器设置
  10. 请你说明一下ConcurrentHashMap的原理?