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

总结:

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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux中类似findfirst的函数,findfirst函数的用法

函数名称: findfirst函数原型: int findfirst(char *fname,struct ffblk *ptr,int attrib)函数功能: 寻找与fname相匹配的第一个文件名称函数返回:参数说明: ptr-保存查找到的文件信息所属文件: #include #include int main(){struct ffblk ffblk;int d…

C/C++混淆点-逗号运算符

在C中&#xff0c;逗号是很常用的。作为一个运算符它虽然不常用&#xff0c;但我们也应该学会它的用法。 1.如&#xff1a;a3*4,4*5,5*6; 由于“”的优先级高于“&#xff0c;”&#xff0c;所以程序从左向右运行&#xff0c;即先运行a3*4。之后的4*5&#xff0c;5*6仅仅运行&a…

linux 添加重定向域名,Linux系统中Nginx的安装并进行域名认证和重定向

Linux系统中Nginx的安装并进行域名认证和重定向本文主要介绍Linux系统中Nginx的安装并进行域名认证和重定向&#xff0c;希望通过本知识点的讲解对大家今后的学习和工作有所帮助&#xff0c;下面进行具体介绍&#xff1a;12.6 Nginx安装cd /usr/local/srcwget http://nginx.org…

C/C++混淆点-转义字符

从表中可以看出&#xff0c;在C语言中有三种转义字符&#xff0c;它们是&#xff1a;一般转义字符、八进制转义字符和十六进制转义字符。 所有的转义字符只代表一个字符 1. 一般转义字符 这种转义字符&#xff0c;虽然在形式上由两个字符组成&#xff0c;但只代表一个字符。…

linux如何安装python环境变量中,Windows和linux环境下python安装及环境变量的配置

安装包的安装无需双版本存在情况下安装1)下载源码包2)解压源码包并进入文件夹./configure ; make && make install3)使用python -V查看是否安装成功&#xff0c;安装成功会显示python版本信息需要双版本安装python版本1)同上&#xff0c;需要下载3.6源码包2)解压源码包…

C/C++混淆点-strcat和strcpy区别

一、原因分析 假设&#xff1a; char * strNULL; strnew char[11];你想为字符串str开辟一个存储十个字符的内存空间&#xff0c;然后你现在有两个字符串&#xff1a;char * c1"abc"和char * c2"123";你想将这两个字符串都拼接在str字符串中&#xff0c;你…

linux有读EC RAM的工具吗,Step to UEFI (179)Shell下 EC Ram 读取工具

最近工作需要在 UEFI Shell 下Check EC Ram 的设定&#xff0c;发现手上只有 Windows 下的读取工具(RW Everything)。于是研究了一下如何在Shell 读取 EC Ram。根据【参考1】读取的流程如下&#xff1a;Port 66 CommandsThere are also some EC commands that use ports 0x66 …

C++基础13-类和对象之继承1

在 C中可重用性(software reusability)是通过继承(inheritance)这一机制来实现的。 如果没有掌握继承性,就没有掌握类与对象的精华。 总结&#xff1a; 1、只要是父类中的private成员&#xff0c;不管是什么继承方式&#xff0c;儿子都访问不了&#xff0c;但它是存在在儿子之…

线程锁定CPU linux,linux 线程与CPU绑定

看到很多程序都是根据CPU个数来创建线程个数&#xff0c;当时很不理解他们之间的关系&#xff0c;请教了项目组的同事后才有了大致了解。1. 相关系统函数下面的函数可以通过man命令查询到。SYNOPSIS#define _GNU_SOURCE#include int pthread_setaffinity_np(pthread_t thread, …

C++基础13-类和对象之继承2

总结&#xff1a; 1、子类对象可以当做父类对象使用 2、子类对象可以直接赋值给父类对象 3、子类对象能够直接初始化父类对象 4、父类指针可以直接指向子类对象 5、凡是继承过来的属性和函数都可以在子类中用this-> 进行访问 6、默认构造函数并不会初始化数据成员 7、如果…

linux内核 块驱动程序,linux – 为什么内核使用默认的块驱动程序而不是我的驱动程序代码?...

我写了一个块驱动程序,它创建了一个虚拟块设备(sbd0).我为该块设备注册了所有设备操作:(请参阅2.6.32内核源代码中的include /linux / blkdev.h)static struct block_device_operations sbd_ops {.owner THIS_MODULE,.open sbd_open,.release sbd_close,.ioctl sbd_ioctl,…

C++基础14-类和对象之多继承与虚继承

多继承&#xff1a;一个类有多个直接基类的继承关系称为多继承 总结&#xff1a; 1、一般将具有菱形样式继承方式的某些类声明为虚继承 3、虚继承的主要目的是为了防止二义性 2、虚继承就是在继承方式前加virtual 如果一个派生类从多个基类派生&#xff0c;而这些基类又有一…

linux系统安装ntp,CentOS下NTP安装配置

安装yum install ntp配置文件 /etc/ntp.confrestrict default kod nomodifynotrap nopeer noqueryrestrict -6 default kod nomodify notrap nopeer noqueryrestrict 127.0.0.1restrict -6 ::1# 用restrict控管权限# nomodify - 用户端不能更改ntp服务器的时间参数# noquery - …

C++基础15-类和对象之多态

总结&#xff1a; 1、在父类中申明虚函数时&#xff0c;一般情况下在子类中也申明&#xff08;便于读代码&#xff09; 一、赋值兼容 赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。 赋值兼容是一种默认行为,不需要任何的显示的转化步骤。 …

傲云浏览器linux,Centos7安装部署zabbix监控软件

目录部署监控服务器部署监控服务器Zabbix ServerWeb页面验证设置部署监控服务器一、安装LNMP环境Zabbix监控管理控制台需要通过Web页面展示出来&#xff0c;并且还需要使用MySQL来存储数据&#xff0c;因此需要先为Zabbix准备基础LNMP环境。1. wget下载官网Nginxwget http://ng…

C++基础16-类和对象之联编,重写,虚析构

1、静态联编和动态联编 1、联编是指一个程序模块、代码之间互相关联的过程。 2、静态联编&#xff08;sta5c binding&#xff09;&#xff0c;是程序的匹配、连接在编译阶段实现&#xff0c;也称为早期匹配。重载函数使用静态联编。 3、动态联编是指程序联编推迟到运行时…

c语言环境变量的作用,C语言获取系统环境变量

C语言获取系统环境变量可以通过如下代码实现.#include #include char *platform(){//获取系统变量信息char *ret;extern char **environ;char **env environ;//打印系统变量信息/*while(*env){//puts(*env);env;}*/ret getenv("OS"); //for windows_ntif(NULL ! re…

C++基础17-纯虚函数和抽象类

总结&#xff1a; 1,含有纯虚函数的类,称为抽象基类,不可实列化。即不能创建对象,存在 的意义就是被继承,提供族类的公共接口。 2,纯虚函数只有声明,没有实现,被“初始化”为 0。 3,如果一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯…

c语言wpf99乘法表,使用JSP输出九九乘法表

R数据实战vehicles--1新建项目vehicles-project 数据文件vehicles.csv与varlabels.txt放在项目文件中【CSS3】---颜色RGBA及渐变色颜色之RGBA RGB是一种色彩标准,是由红(R).绿(G).蓝(B)的变化以及相互叠加来得到各式各样的颜色.RGBA是在RGB的基础上增加了控制alpha透明度的参数…

C++基础18-抽象类-电脑组装练习

01电脑组装me.cpp 需要实现所有的虚函数&#xff0c;不台灵活。架构函数无法写&#xff0c;设计不够成熟 #if 1 #include<iostream> using namespace std; class Computer { public:virtual void caculate() 0;virtual void display() 0;virtual void storage() 0; …