总结:

1、等号操作符重载注意事项:
    (1)防止自身赋值
    (2)先将自身的额外开辟的空间回收掉
    (3)执行深拷贝
2、注意函数的返回引用或者元素:如果需要连续使用 返回元素
3、如果一个函数传递const修饰的对象,那么此对象调用的成员函数也应为const类型
4、重载小括号 称这种对象为仿函数
5、字符串>>重载时防止初始化的字符串长度为空

MyString.h:

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class MyString
{
public:MyString();MyString(int len); //创建一个长度为len的string对象MyString(const char*str);MyString(const MyString& another);~MyString();//重载操作符[]  //char* operator[](int index);char& operator[](int index);  //mystring.operator[](index)//重载操作符<<  friend ostream& operator<<(ostream& os, MyString &mystring);//重载操作符>>friend istream& operator>>(istream& is, MyString &mystring);  //重载操作符==bool operator==(const MyString &mytring2) ;//重载操作符!=friend bool operator!=(MyString &mystring1, MyString &mytring2);//重载操作符=//MyString operator=(const MyString &another);MyString& operator=(const MyString &another);//重载操作符+ 可以连加 所以返回匿名对象 不加引用//如果加引用 第一次加法后返回一个乱码值//friend MyString& operator+(const MyString &another1, const MyString &another2);MyString operator+(MyString &another);private:int len;char *str;
};

MyString.cpp:

#include "MyString.h"MyString::MyString()
{this->len = 0;this->str = NULL; //表示零值或空值//this->str = "";  //表示空字符串 里面有\0
}MyString::MyString(int len)
{this->len = len;this->str = new char[len];
}MyString::MyString(const char * str)
{/*meint len = strlen(str);this->len = len + 1;this->str = new char[len + 1];for (int i = 0; i < len; i++){this->str[i] = str[i];}*/if (str == NULL) {this->len = 0;this->str = new char[0+1]; strcpy(this->str, "");}else {int len = strlen(str);this->len = len;this->str = new char[len + 1];strcpy(this->str, str);}
}MyString::MyString(const MyString & another)
{//拷贝构造函数不需要回收垃圾 初始化时被调用this->len = another.len;this->str = new char[this->len + 1];strcpy(this->str, another.str);}MyString::~MyString()
{if (this->str != NULL) {cout << this->str << "执行了析构函数" << endl;delete [] this->str;this->str = NULL;this->len = 0;}
}char& MyString::operator[](int index)
{// TODO: 在此处插入 return 语句return this->str[index];
}bool MyString::operator==(const MyString & mystring2)
{if (this->len != mystring2.len) {return false;}for (int i = 0; i < this->len; i++){if (this->str[i] != mystring2.str[i]) {return false;}}return true;
}MyString& MyString::operator=(const MyString & another)
{if (this == &another) {return *this;}// TODO: 在此处插入 return 语句if (this->str != NULL) {delete this->str;this->str = NULL;this->len = 0;}this->len = another.len;this->str = new char[this->len + 1];strcpy(this->str, another.str);return *this;}ostream& operator<<(ostream& os, MyString &mystring) {cout << "len:";os << mystring.len;cout << "str:";os<< mystring.str ;return os;
}istream& operator>>(istream &is, MyString &mystring)
{// TODO: 在此处插入 return 语句//先释放mystring内存//char *str=NULL;cin>>str; 程序崩溃//1、将mystring之前的字符串释放掉if (mystring.str != NULL) {delete mystring.str;mystring.str = NULL;mystring.len = 0;}//2、通过cin添加新的字符串char temp_str[4096] = { 0 };cin >> temp_str;int len = strlen(temp_str);mystring.str = new char[len + 1];strcpy(mystring.str, temp_str);mystring.len = len;return is;
}MyString MyString::operator+(MyString & another)
{// TODO: 在此处插入 return 语句MyString temp;int len= this->len + another.len;temp.len = len;temp.str = new char[len + 1];memset(temp.str, 0, len + 1);  //清空 strcat需要memset  strcpy不需要strcat(temp.str, this->str);strcat(temp.str, another.str);//temp.str = this->str + another.str;return temp;
}
bool operator!=(MyString &mystring1,MyString &mytring2) {return !(mystring1 == mytring2);
}

main.cpp:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include"MyString.h"
using namespace std;void test01() {string s1("123");//equal tostring s2 = "123";string s3(s1);  //重载拷贝构造string s4;  s4 = s1;       //重载=s4 = s1 + s2;  //重载+s2[1] = 'x';   //重载[]cout << s2 << endl;  //重载<<
}
/*
1x3
*/void test02() {MyString s1;MyString s2("123");//MyString s3(NULL);MyString s4(s2);//cout <<"s1"<< s1 << endl;  截断后面输出cout << "s2" << s2 << endl;cout << "s4" << s4 << endl;s2[1] = 'x';cout << "s2" << s2 << endl;cout << "s4" << s4 << endl;MyString s5;s5 = s2;cout << "s5" << s5 << endl;
}
/*
s2len:3str:123
s4len:3str:123
s2len:3str:1x3
s4len:3str:123
s5len:3str:1x3
1x3执行了析构函数
123执行了析构函数
1x3执行了析构函数
*/
void test03() {MyString s1("abc");cin >> s1;cout << s1 << endl;
}
/*
ddd
len:3str:ddd
ddd执行了析构函数
*/
void test04() {
#if 0string s1("123");string s2("456");cout << (s1 + s2)+s2 << endl;cout << s1 << endl;cout << s2 << endl;
#endifMyString s1("123");MyString s2("456");cout << (s1 + s2) << endl;cout << s1 << endl;cout << s2 << endl;
}
/*
123456执行了析构函数
len:6str:123456
123456执行了析构函数
len:3str:123
len:3str:456
456执行了析构函数
123执行了析构函数
*/
void test05() {
#if 0string s1("123");string s2("456");if (s1 == s2) {cout << "等于" << endl;}elsecout << "不等于"<< endl;
#endif //等价于MyString s1("123");MyString s2("456");if (s1 == s2) {cout << "等于" << endl;}elsecout << "不等于" << endl;if (s1 != s2) {cout << "bu等于" << endl;}elsecout << "等于" << endl;
}
/*
不等于
bu等于
456执行了析构函数
123执行了析构函数
*/
int main() {test01();//test02();//test03();//test04();//test05();return 0;
}

C++基础12-类和对象之操作符重载-string练习相关推荐

  1. C++基础11-类和对象之操作符重载1

    总结: 1.运算符重载的本质是函数重载 2.运算符重载可分为成员函数重载和全局函数重载(差一个参数) 3.运算符重载函数的参数至少有一个是类对象(或类对象的引用) 4.不可以被重载的操作符有:成员选择 ...

  2. JAVA基础七 类和对象

    文章目录 JAVA基础七 类和对象 01 引用 02 继承 03 方法重载 04 构造方法 05 this 06 传参 07 包 08 访问修饰符 09 类属性 10 类方法 11 属性初始化 12 ...

  3. JAVA基础––从类和对象开始

    JAVA基础--从类和对象开始 一.概念 1.面向对象中类和对象的概念 对象:对象是具有状态和行为的实体,例如某个具体的学生,或者是王者荣耀里的英雄,可以是物理实体,也可以是逻辑实体. 类:类是一组具 ...

  4. Java_面向对象基础(类、对象、方法和构造函数)

    Java的面向对象基础(类.对象.方法和构造函数) 面向对象的基本概念 面向对象的设计思想 什么是类 什么是对象 类的定义 设计面向对象的例子 步骤一:设计动物这个类 步骤二:创建具体的动物 步骤三: ...

  5. 【C++基础】类和对象——友元

    [C++基础]类和对象--友元 友元的概念 在C++中,不能被外部访问的私有属性,通过友元可以访问. 友元的关键字:friend 友元的三种实现 全局函数做友元 类做友元 成员函数做友元 一.全局函数 ...

  6. java基础(类与对象、集合)

    java基础(类与对象.集合) 类与对象 类与对象中的栈和堆 构造方法 this关键字 面向对象三大特性 封装性(private) 继承性(extends) 方法重写(@override) 多态性 向 ...

  7. C++学习笔记 - 阶段三:C++核心编程 - Chapter7:类和对象-C++运算符重载

    阶段三:C++核心编程 Chapter7:类和对象-C++运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 7.1 加号运算符重载 作用:实现两个自定义数 ...

  8. C++ 学习 ::【基础篇:17】:C++ 类与对象:运算符重载介绍、运算符重载函数(类内与类外区别)写法及简单设计实现

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...

  9. 刻意练习:Python基础 -- Task10. 类与对象

    背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...

最新文章

  1. 区块链技术到底有啥用?
  2. 使用virtualbox nat方式中的端口映射使用ssh服务
  3. Angular里的style property binding的一个例子
  4. gcc oracle mysql_Linux下C语言访问Oracle数据库Demo
  5. linux跑循环脚本占内存,Linux下实现脚本监测特定进程占用内存情况
  6. 微软面试题:有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字
  7. 程序员面试金典 - 面试题 04.12. 求和路径(二叉树递归)
  8. android 抓取webview中的所有图片_如何一键提取PDF文档中的所有图片?
  9. 浮点类型误区 “!=”
  10. html自动图片墙,基于html5实现的图片墙效果
  11. python把数字逐一存入列表_python实现将range()函数生成的数字存储在一个列表中...
  12. 项目实战之服务端分页的实现——SQL
  13. python生成词云教程(附带QQ聊天记录生成词云实战)
  14. admin ajax,如何在FastAdmin中使用Ajax发送请求?
  15. office2010下压缩图片没有效果解决方案
  16. VS2010提示asp.net v4.0 尚未在web服务器上注册
  17. 51单片机之串口通信详解及代码示例
  18. 使用SoftEther 上免费校园网(ipv6)
  19. 用Gitosis搭建Git服务器(经典资料)
  20. uoj #172. 【WC2016】论战捆竹竿

热门文章

  1. 09 - java 包命名规范
  2. idea install 失败_idea maven install 卡住,无报错排查。
  3. java的队列实现方法_Java实现队列的三种方法集合
  4. linux sql 语句菜鸟,Linux安装mysql
  5. IDEA——常用代码模板
  6. Git初学札记(六)————在远程新建本地Branch与在本地新建远程Branch
  7. mysql 数据记录导出_mysql如何导出600万条记录的数据表?
  8. html中依次展开的搜索框,jQuery+CSS3动画展开收缩搜索框特效
  9. java 密码生成器_Java课程设计-随机密码生成器
  10. malloc动态分配数组以及指针数组大小