1. 下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数。
  2. [cpp] view plain copy
  3. #include<iostream>
  4. #include<iomanip>
  5. using namespace std;
  6. class String{
  7. friend ostream& operator<< (ostream&,String&);//重载<<运算符
  8. friend istream& operator>> (istream&,String&);//重载>>运算符
  9. public:
  10. String(const char* str=NULL); //赋值构造兼默认构造函数(char)
  11. String(const String &other); //拷贝构造函数(String)
  12. String& operator=(const String& other); //operator= //赋值函数
  13. String operator+(const String &other)const; //operator+
  14. bool operator==(const String&); //operator==
  15. char& operator[](unsigned int); //operator[]
  16. size_t size(){return strlen(m_data);};
  17. ~String(void) {delete[] m_data;} //析构
  18. private:
  19. char *m_data; // 用于保存字符串
  20. };
  21. inline String::String(const char* str)
  22. {
  23. if(!str)m_data=0; //声明为inline函数,则该函数在程序中被执行时是语句直接替换,而不是被调用
  24. else {
  25. m_data=new char[strlen(str)+1];
  26. strcpy(m_data,str);
  27. }
  28. }
  29. inline String::String(const String &other)
  30. {
  31. if(!other.m_data)m_data=0;//在类的成员函数内可以访问同种对象的私有成员(同种类则是友元关系)
  32. else
  33. {
  34. m_data=new char[strlen(other.m_data)+1];
  35. strcpy(m_data,other.m_data);
  36. }
  37. }
  38. inline String& String::operator=(const String& other)
  39. {
  40. if (this!=&other)
  41. {
  42. delete[] m_data;
  43. if(!other.m_data) m_data=0;
  44. else
  45. {
  46. m_data = new char[strlen(other.m_data)+1];
  47. strcpy(m_data,other.m_data);
  48. }
  49. }
  50. return *this;
  51. }
  52. inline String String::operator+(const String &other)const
  53. {
  54. String newString;
  55. if(!other.m_data)
  56. newString = *this;
  57. else if(!m_data)
  58. newString = other;
  59. else
  60. {
  61. newString.m_data = new char[strlen(m_data)+strlen(other.m_data)+1];
  62. strcpy(newString.m_data,m_data);
  63. strcat(newString.m_data,other.m_data);
  64. }
  65. return newString;
  66. }
  67. inline bool String::operator==(const String &s)
  68. {
  69. if ( strlen(s.m_data) != strlen(m_data) )
  70. return false;
  71. return strcmp(m_data,s.m_data)?false:true;
  72. }
  73. inline char& String::operator[](unsigned int e)
  74. {
  75. if (e>=0&&e<=strlen(m_data))
  76. return m_data[e];
  77. }
  78. ostream& operator<<(ostream& os,String& str)
  79. {
  80. os << str.m_data;
  81. return os;
  82. }
  83. istream &operator>>( istream &input, String &s )
  84. {
  85. char temp[ 255 ]; //用于存储输入流
  86. input>>setw(255)>>temp;
  87. s = temp; //使用赋值运算符
  88. return input; //使用return可以支持连续使用>>运算符
  89. }
  90. int main()
  91. {
  92. String str1="Aha!";
  93. String str2="My friend";
  94. String str3 = str1+str2;
  95. cout<<str3<<"/n"<<str3.size()<<endl;
  96. return 0;
  97. }


标准库String类的更多相关文章

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

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

  2. C++标准库异常类

    C++标准库异常类 2012-12-24 16:27 5269人阅读 评论(1) 收藏 举报  分类: c/c++(36)  C++标准库异常类继承层次中的根类为exception,其定义在excep ...

  3. C++标准库<string>简单总结

    C++标准库<string>简单总结 在C++中,如果需要对字符串进行处理,那么它自带的标准库<string>无疑是最好的选择,它实现了很多常用的字符处理函数. 要想使用标准C ...

  4. C++异常第二篇---C++标准库异常类exception的使用

    1 继承图示 2 具体讲解 C++标准库异常类继承层次中的根类为exception,其定义在exception头文件中,它是C++标准库所有函数抛出异常的基类,exception的接口定义如下: na ...

  5. 【C++ Primer每日刷】之三 标准库 string 类型

    标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...

  6. C++标准库string类型

    string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用. 本文地址:http://www.cn ...

  7. C++标准库string

    C++标准库string 定义和初始化 string s1 默认初始化,s1是一个空串 string s2(s1) s2是s1的副本 string s2 = s1 等价于s2(s1),s2是s1的副本 ...

  8. c/c++ 标准库 string

    c/c++ 标准库 string 标准库 string的小例子 test1~test10 #include <iostream> using namespace std; int main ...

  9. C 标准库 - string.h

    C 标准库 - string.h This header file defines several functions to manipulate C strings and arrays. stri ...

随机推荐

  1. Android 5.0源码编译问题

    如果是自己通过repo和git直接从google官网上download的源码,请忽略这个问题,但是由于google在国内被限制登录,通过这一种方法不是每个人都能download下来源码,通常的做法就是 ...

  2. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

  3. MyBatis魔法堂:Insert操作详解(返回主键、批量插入)

    一.前言    数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二. insert元素 属性详解   其属性如下: parameterType  ...

  4. python之最强王者(4)——字符串

    1.Python 中文编码 前面章节中我们已经学会了如何用 Python 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界" ...

  5. VMware安装CentOS时,无法以图形界面安装解决办法

    有的同学问: 用虚拟机软件(vmware.VirtualBox)安装CentOS系统时, 安装过程中没有中文,也没有出现图形界面,都是以命令行方式去安装, 有时候又会出现图形界面,不知道哪里配置的问题 ...

  6. 学习笔记 MYSQL报错注入(count()、rand()、group by)

    首先看下常见的攻击载荷,如下: select count(*),(floor(rand(0)*2))x from table group by x; 然后对于攻击载荷进行解释, floor(rand( ...

  7. BW知识问答汇总

    什么是sap的星型结构,能不能详细讲解一下? Cube的星型结构中SID技术的优点有哪些? 什么是BW的星型结构,与传统的星型结构的区别是什么? SAP的星型结构相对于传统的星型结构优势? Cube与 ...

  8. Android开发学习—— ContentProvider内容提供者

    * 应用的数据库是不允许其他应用访问的* 内容提供者的作用就是让别的应用访问到你的数据库.把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用. Uri:包含一个具有一定格式的字符串的对 ...

  9. 突然想到一个问题:有关 cqrs 分离

    大部分的系统,都是查询多,c少,那为什么我们不把q放在内存里面,而c直接操作数据库呢? 就如enode,c在内存,而q在数据库,当然q也很容易扩展到内存缓存上.二个enode案例demo,都可以让c的 ...

  10. Node.js 教程 06 - 函数

    前言: 本篇介绍的是Node.js中的函数,相对于上一篇会简单一点,其实和我们Javascript中的function无异. 好了,废话不多说了,我们进入正题吧. Node.js函数: [示例1:创建 ...