模块化设计:

头文件:

  1. <span style="font-size:18px;">
  1. #ifndef operator_operator_h
  2. #define operator_operator_h
  3.  
  4. #include <iostream>
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. class MyString
  10. {
  11. public:
  12. //三个重载的构造函数
  13. MyString();
  14. MyString(const char* str);
  15. MyString(const MyString& str);
  16. //析构函数
  17. ~MyString();
  18.  
  19. //重载运算符
  20. MyString& operator = (const MyString& str);
  21. char& operator[](int index);//訪问下标
  22. friend ostream& operator << (ostream& out, const MyString& str); //重载输出操作符
  23. friend istream& operator >> (istream& in, MyString& str); //重载输入操作符
  24. friend MyString operator + (const MyString& str1, const MyString& str2); //重载加号操作符。注意返回引用不行
  25. friend MyString operator += (MyString& str1, const MyString& str2); //重载+=操作符
  26. friend bool operator == (const MyString& str1, const MyString& str2); //重载相等操作符
  27. friend bool operator != (const MyString& str1, const MyString& str2); //重载不相等操作符
  28.  
  29. private:
  30. char* p;
  31. int len;
  32. };
  33.  
  34. #endif;
  1. </span>

功能函数:

  1. <span style="font-size:18px;">
  1. #include "operator.h"
  2.  
  3. //默认构造函数,初始化为空串
  4. MyString::MyString()
  5. {
  6. len = 0;
  7. p = new char[len + 1];
  8. p[0] = '\0';
  9. }
  10.  
  11. //构造函数,用一个字符串初始化
  12. MyString::MyString(const char* str)
  13. {
  14. len = strlen(str);
  15. p = new char[strlen(str) + 1];
  16. strcpy_s(p, strlen(str) + 1, str);
  17. }
  18.  
  19. //拷贝构造函数,用另外一个string初始化
  20. MyString::MyString(const MyString& str)
  21. {
  22. len = str.len;
  23. p = new char[strlen(str.p) + 4];
  24. strcpy_s(p, strlen(str.p) + 1, str.p);
  25. }
  26.  
  27. //析构函数
  28. MyString::~MyString()
  29. {
  30. delete[] p;
  31. }
  32.  
  33. //重载赋值操作符( = )
  34. MyString& MyString::operator = (const MyString& str)
  35. {
  36. if (this->p == str.p)
  37. {
  38. return *this;
  39. }
  40. delete[] p;
  41. len = str.len;
  42. p = new char[len + 1];
  43. strcpy_s(p, len + 1, str.p);
  44. return *this;
  45. }
  46.  
  47. //重载输出操作符( << )
  48. ostream& operator << (ostream& out, const MyString& str)
  49. {
  50. out << str.p;
  51. return out;
  52. }
  53.  
  54. //重载输入操作符( >> )
  55. istream& operator >> (istream& in, MyString& str)
  56. {
  57. in >> str.p;
  58. return in;
  59.  
  60. }
  61.  
  62. //重载加号操作符( + )
  63. MyString operator + (const MyString& str1, const MyString& str2)
  64. {
  65. MyString str;
  66. delete[] str.p;
  67. str.len = str1.len + str2.len;
  68. str.p = new char[str.len + 1];
  69. strcpy_s(str.p, str.len + 1, str1.p);
  70. strcat_s(str.p, str.len + 1, str2.p);
  71. return str;
  72. }
  73.  
  74. //重载相加赋值操作符( += )
  75. MyString operator += (MyString& str1, const MyString& str2)
  76. {
  77. str1 = str1 + str2;
  78. return str1;
  79. }
  80.  
  81. //重载相等操作符
  82. bool operator == (const MyString& str1, const MyString& str2)
  83. {
  84. if (strcmp(str1.p, str2.p) == 0)
  85. {
  86. return true;
  87. }
  88. return false;
  89. }
  90.  
  91. //重载不相等操作符
  92. bool operator != (const MyString& str1, const MyString& str2)
  93. {
  94. if (strcmp(str1.p, str2.p) == 0)
  95. {
  96. return false;
  97. }
  98. return true;
  99. }
  100.  
  101. //重载下标([])
  102. char& MyString::operator[](int index)
  103. {
  104. return p[index];
  105. }
  106.  
  107. </span>

測试程序:

  1. <span style="font-size:18px;">
  2. #include "operator.h"
  3.  
  4. int main()
  5. {
  6. MyString mystr("asfasgdhf"); //測试构造函数,用一个字符串初始化
  7.  
  8. cout << mystr[2] << endl;
  9.  
  10. mystr[4] = 'd';
  11.  
  12. cout << mystr <<endl;
  13.  
  14. MyString mystr2(mystr); //用另外一个string初始化
  15.  
  16. cout << mystr2 << endl;
  17.  
  18. MyString mystr3;
  19.  
  20. mystr3 = mystr + mystr2; //測试加号运算符,測试赋值运算符
  21.  
  22. cout << mystr + mystr2 << endl;
  23.  
  24. mystr3 += mystr; //測试+=运算符
  25.  
  26. cout << mystr3 << endl;
  27.  
  28. cout << (mystr == mystr2) << endl; //測试 ==
  29.  
  30. cout << (mystr != mystr3) << endl; //測试 。=
  31.  
  32. MyString mystr4;
  33.  
  34. cout << "Input a series characters, end of ctrl+z." << endl;
  35.  
  36. cin >> mystr4; //測试重载的输入符号( >> )
  37.  
  38. cout << mystr4 << endl;
  39.  
  40. return 0;
  41. }
  42. </span>

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSXJlYW5fTGF1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

【C++】String类中的运算符重载的更多相关文章

  1. C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  2. C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  3. C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. string类中运算符重载实现

    C++中预定义的加.减等运算符的操作对象只能是基本的数据类型.如果要在用户自定义的类型对象上应用同样的运算符,就需要通过运算符重载来重新定义其实现,使它能够用于自定义类型执行特定的操作,所以运算符重载 ...

  5. C++中的运算符重载注意事项

    1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...

  6. String类中常用的操作

    一.获取: 1.获取字符串的长度(注意是方法,不是跟数组的属性一样的) int length(); 1 public static void getLength(){ 2 String s = &qu ...

  7. Java——String类中的compareTo方法总结

    String类的定义:    java.lang  类 String   java.lang.Object      java.lang.String 所有已实现的接口:Serializable, C ...

  8. 编码实现字符串类CNString实现运算符重载

    题目描述: 编码实现字符串类CNString,该类有默认构造函数.类的拷贝函数.类的析构函数及运算符重载,需实现以下"="运算符."+"运算."[]& ...

  9. C++解析(16):友元与类中的函数重载

    0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...

随机推荐

  1. 纯JS监听document是否加载完成

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 概述 一个document 的 Document.readyState 属性描述了文档的加载状态. 一个文档的 read ...

  2. [Javascript] 5个最佳的Javascript日期处理类库

    在大家日常网站开发和web应用开发中,我们往往需要有效的调用Javascript处理日期和时间格式相关的函数,在Javascript中已经包含了部分最基本的内建处理方法. 在大家日常网站开发和web应 ...

  3. Css float 盒子模型 position

    属性: float 浮动 浮动的内容用div包起来,给div设置宽高 clear 清除浮动. box-sizing 标准模式下的盒模型 content-box:(默认属性) padding和borde ...

  4. (整)deepin下mysql的安装与部分错误解决办法

    deepin(深度)是国产Linux系统,程序员肯定要了解Linux系统啦,但是在程序安装上可能会有些不习惯,现在让我们来看看mysql在deepin上的安装过程. 1.傻瓜式命令行安装 这也是Lin ...

  5. Android-crop:漂亮的图片裁切工具

    主要特点 Gradle构建和AAR 现代化的UI 向后兼容到SDK 10 配置简单 示例项目 使用 首先,在你的 manifest 文件中申明 CropImageActivity : <acti ...

  6. Spring 获取propertise文件中的值

    Spring 获取propertise文件中的值 Spring 获取propertise的方式,除了之前的博文提到的使用@value的注解注入之外,还可以通过编码的方式获取,这里主要说的是要使用Emb ...

  7. echarts 纵坐标数字太长显示补全,以及文字倾斜显示

    如上数字太长,显示补全,以及x坐标的月份当数量大的时候也会显示补全: x可以调节纵坐标label的宽度 y2可以调节横坐标label的高度 grid: { x: 100, //默认是80px y: 6 ...

  8. 杭电 2035 人见人爱A^B【快速幂取模】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2035 解题思路:这一题数据不大,可以用同余来做,也可以用快速幂来做 反思:定义成 #include&l ...

  9. 杭电 2035 人见人爱A^B【同余】

    #include<stdio.h> int main() { int a,b; int s; int i; while(scanf("%d %d",&a,&am ...

  10. JS 九九运算表

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...