hwk4:C++ 运算符重载

用mystring实在部分C++运算符重载

mystring.h:

#ifndef MYSTRING_H
#define MYSTRING_H#include <iostream>
#include <cstring>using namespace std;class myString
{
private:char *str;          //记录c风格的字符串int size;            //记录字符串的实际长度
public://无参构造myString():size(10){str = new char[size];         //构造出一个长度为10的字符串strcpy(str,"");         //赋值为空串cout<<"无参构造"<<endl;}//有参构造myString(const char *s)          //string  s("hello world"){size = strlen(s);str = new char[size+1];strcpy(str, s);cout<<"有参构造"<<endl;}//拷贝构造myString(const myString &other){str=new char[other.size];strcpy(str,other.str);this->size=other.size;cout<<"拷贝构造"<<endl;}//析构函数~myString(){delete []str;cout<<"析构函数"<<endl;}//拷贝赋值函数myString &operator=(const myString &other);//判空函数bool string_empty()const;//size函数int string_size()const;//c_str函数const char* c_str()const;//at函数char &at(int pos);//加号运算符重载myString operator+(const myString &other)const;//加等于运算符重载myString operator+=(const myString &other);//关系运算符重载(>)bool operator>(const myString &other)const;//中括号运算符重载char operator[](int index)const;
};#endif // MYSTRING_H

mystring.cpp:

#include "mystring.h"//拷贝赋值函数
myString &myString::operator=(const myString &other)
{if(this!=&other){if(str!=NULL){delete []str;}str=new char[other.size];strcpy(str,other.str);this->size=other.size;}return *this;
}
//判空函数
bool myString::string_empty()const
{return strcmp(str,"")==0;
}
//size函数
int myString::string_size()const
{return size;
}
//c_str函数
const char* myString::c_str()const
{return str;
}
//at函数
char &myString::at(int pos)
{while(1){if(pos<0||pos>=size){cout<<"输入格式不对,范围为0~"<<size<<endl;}else{break;}}return *(str+pos);
}
//加号运算符重载
myString myString::operator+(const myString &other)const
{myString a=*this;char buf[a.size];strcpy(buf,a.str);if(a.str!=NULL){delete []a.str;}a.size=a.size+other.size;a.str=new char[a.size+1];strcpy(a.str,buf);strcat(a.str,other.str);return a;
}
//加等于运算符重载
myString myString::operator+=(const myString &other)
{char buf[size];strcpy(buf,str);if(str!=NULL){delete []str;}size=size+other.size;str=new char[size];strcpy(str,buf);strcat(str,other.str);return *this;
}
//关系运算符重载(>)
bool myString::operator>(const myString &other)const
{return strcmp(str,other.str)>0;
}
//中括号运算符重载
char myString::operator[](int index)const
{while(1){if(index<0||index>=size){cout<<"输入格式不对,范围为0~"<<size<<endl;}else{break;}}return *(str+index);
}

main.cpp:

#include "mystring.h"int main()
{myString a("hello world");cout<<"字符串a为 "<<a.c_str()<<endl;cout<<"字符串大小为"<<a.string_size()<<endl;a.at(0)='H';cout<<"字符串a为 "<<a.c_str()<<endl;myString b;cout<<"字符串b为空?"<<b.string_empty()<<endl;b=a;cout<<"字符串b为 "<<b.c_str()<<endl;myString c=a+b;cout<<"字符串c为 "<<c.c_str()<<endl;myString d("hahaha");d+=a;cout<<"字符串d为 "<<d.c_str()<<endl;cout<<"字符串d比a大? "<<d.operator>(a)<<endl;return 0;
}

算术类运算符重载

1> 种类:+、-、*、/、%

2> 表达式格式:L # R //L表示左操作数 #表示运算符 R表示右操作数

3> 左操作数:既可以是左值也可以是右值,运算过程中不会被修改

4> 右操作数:既可以是左值也可以是右值,运算过程中不会被修改

5> 结果:结果是一个同类的右值,不能被改变

6> 定义格式:

全局函数版:const 类名 operator# (const 类名 &L, const 类名 &R)

成员函数版:const 类名 operator# ( const 类名 &R)const

关系类运算符重载

1> 种类:>、=、

2> 表达式格式:L # R //L表示左操作数 #表示运算符 R表示右操作数

3> 左操作数:既可以是左值也可以是右值,运算过程中不会被修改

4> 右操作数:既可以是左值也可以是右值,运算过程中不会被修改

5> 结果:bool类型,表示真假

6> 定义格式:

全局函数版:bool operator# (const 类名 &L, const 类名 &R)

成员函数版:bool operator# ( const 类名 &R)const

赋值类运算符重载

1> 种类:=、+=、-=、*=、/=、%=

2> 表达式格式:L # R //L表示左操作数 #表示运算符 R表示右操作数

3> 左操作数:只能是左值

4> 右操作数:既可以是左值也可以是右值,运算过程中不会被修改

5> 结果:自身的引用

6> 定义格式:

全局函数版:类名 &operator# (类名 &L, const 类名 &R)

成员函数版:类名 & operator# ( const 类名 &R)

单目运算符重载

1> 种类:!、~、*、&、-

2> 表达式格式: # O // #表示运算符 O表示操作数

3> 操作数:既可以是左值也可以是右值,运算过程中不能更改

4> 结果:同类的右值

5> 定义格式:

全局函数版:类名 operator# (const 类名 &O)

成员函数版:类名 operator# ( )const

自增自减运算符

1> 前置自增运算

1、表达式格式:++O

2、操作数:只能是左值

3、结果:更改后自身的引用,是一个左值

4、定义格式

全局函数版:类名& operator++(类名 & other)

成员函数版:类名 & operator++()

2> 后置自增

1、表达式格式:O++

2、操作数:只能是左值

3、结果:临时值,是一个右值,更改之前的值

4、定义格式:为了区分跟前置自增的区别,后置自增多一个哑元进行占位

全局函数版:类名 operator++(类名 & other, int)

成员函数版:类名 operator++(int)

插入提取运算符的重载(>)

1> 这两个运算符的使用:cout>对象名 //cout.operator

2> cin和cout所在的类分别为istream和ostream类,如果想要实现成员函数版的运算符重载,需要对这两个类重新更改内容

3> 对于这两个运算符重载,只能使用全局函数版,借助友元的威力来实现

4> 由于不需要访问istream或ostream类中的私有成员或受保护成员,所以无需将该全局函数在istream和ostream类中设置成友元函数

5> 由于该函数要访问自定义类的私有成员,所以只需在自定义类中将该全局函数设置成友元函数即可

6> 表达式:L#R //L表示cin或cout #表示>运算符 R表示自定义的类对象

7> 左操作数:istream或ostream类对象

8> 右操作数:自定义的类对象

9> 结果:左操作数自身的引用

10> 定义格式

ostream &operator

istream &operator>>(istream &L, 类名 &R);

不能重载的运算符

1> 成员运算符 .

2> 成员指针运算符 .*

3> 作用域限定符 ::

4> 求字节运算符 sizeof

5> 三目运算符 ?:

运算符重载注意事项

1> 运算符重载,不能改变运算符的优先级

2> 运算符重载,不能改变运算符操作数个数

3> 运算符重载,不能更改运算符的本质逻辑,例如不允许在加法运算符重载函数中,实现加法

4> 运算符重载,不能自己造运算符,是在已有的运算符的基础上进行重载操作

5> 运算符重载,不能改变运算符的结合律

6> 运算符重载,一般不设置默认参数

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

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

相关文章

计算机组成原理期末复习

第一章 上机前的准备&#xff1a;建立数学模型、确定计算方法和编制解题程序n位操作码有 2 n 2^n 2n种不同操作主储存器&#xff08;主存/内存&#xff09;包括存储体M、各种逻辑部件及控制电路。储存体有多个储存单元&#xff0c;储存单元有多个储存元件&#xff0c;每个存储…

《视觉 SLAM 十四讲》V2 第 4 讲 李群与李代数 【什么样的相机位姿 最符合 当前观测数据】

P71 文章目录 4.1 李群与李代数基础4.1.3 李代数的定义4.1.4 李代数 so(3)4.1.5 李代数 se(3) 4.2 指数与对数映射4.2.1 SO(3)上的指数映射罗德里格斯公式推导 4.2.2 SE(3) 上的指数映射SO(3),SE(3),so(3),se(3)的对应关系 4.3 李代数求导与扰动模型4.3.2 SO(3)上的李代数求导…

分布式并行训练(DP、DDP、DeepSpeed)

[pytorch distributed] 01 nn.DataParallel 数据并行初步 数据并行 vs. 模型并行 数据并行&#xff1a;模型拷贝&#xff08;per device&#xff09;&#xff0c;数据 split/chunk&#xff08;对batch切分&#xff09; 每个device上都拷贝一份完整模型&#xff0c;每个device分…

spark SQL 任务参数调优1

1.背景 要了解spark参数调优&#xff0c;首先需要清楚一部分背景资料Spark SQL的执行原理&#xff0c;方便理解各种参数对任务的具体影响。 一条SQL语句生成执行引擎可识别的程序&#xff0c;解析&#xff08;Parser&#xff09;、优化&#xff08;Optimizer&#xff09;、执行…

RabbitMQ核心总结

AMQP协议核心概念 RabbitMQ是基于AMQP协议的&#xff0c;通过使用通用协议就可以做到在不同语言之间传递。 server&#xff1a;又称broker&#xff0c;接受客户端连接&#xff0c;实现AMQP实体服务。 connection&#xff1a;连接和具体broker网络连接。 channel&#xff1a…

c++ std::move 和 std::forward

在C11标准之前&#xff0c;C中默认的传值类型均为Copy语义&#xff0c;即&#xff1a;不论是指针类型还是值类型&#xff0c;都将会在进行函数调用时被完整的复制一份。所以引入了move和forward 临时值&#xff08;右值&#xff09;简述 func("some temporary string&qu…

堆栈与堆(Stack vs Heap)有什么区别?

​编写有效的代码需要了解堆栈和堆内存&#xff0c;这使其成为学习编程的重要组成部分。不仅如此&#xff0c;新程序员或职场老手都应该完全熟悉堆栈内存和堆内存之间的区别&#xff0c;以便编写有效且优化的代码。 这篇博文将对这两种内存分配技术进行全面的比较。通过本文的…

Asp.net core api http请求是怎么找到对应方法并参数映射的

在ASP.NET Core中&#xff0c;HTTP请求是通过路由系统找到对应的方法&#xff0c;并将请求的参数映射到方法的参数上。具体的过程如下&#xff1a; 路由系统&#xff1a; ASP.NET Core中的路由系统负责处理传入的HTTP请求&#xff0c;并根据请求的路径和其他条件决定将请求发送…

网络协议--链路层

2.1 引言 从图1-4中可以看出&#xff0c;在TCP/IP协议族中&#xff0c;链路层主要有三个目的&#xff1a; &#xff08;1&#xff09;为IP模块发送和接收IP数据报&#xff1b; &#xff08;2&#xff09;为ARP模块发送ARP请求和接收ARP应答&#xff1b; &#xff08;3&#xf…

电子元器件数量BOM表统计

在我们绘制完电路原理图或PCB板图后需要输出每个元器件&#xff0c;但是绘图软件上器件名称&#xff0c;数值&#xff0c;模本不是跟理想的一样&#xff0c;BOM表输出还有根据自己的公司规制重新命名&#xff0c;有时根据&#xff0c;常用的位标就是R&#xff0c;C&#xff0c;…

java操作文件,生成文件,读取文件,按顺序读取文件

按顺序读取文件名 Arrays.sort()方法对文件数组进行排序&#xff0c;然后按照排序后的顺序遍历文件数组&#xff0c;以按照文件名从大到小的顺序展示文件名 public class FileSortExample {public static void main(String[] args) {File directory new File("path/to/…

Linux文件系统及命令 | 实用操作指令汇总

目录 ctrl c 强制停止与ctrl d 退出或登出 history&#xff1a;历史命令搜索 clear:清屏 ln命令&#xff1a;创建软硬连接 cat命令&#xff1a;显示文件命令 less命令&#xff1a;查看大文件 grep命令&#xff1a;正则表达式使用 sort命令&#xff1a;排序 uniq命令…

JSON的MIME媒体类型是application/json

JSON&#xff08;全称 JavaScript Object Notation&#xff09;即JavaScript对象表示法&#xff0c;通知使用application/json媒体类型。 目录 1、JSON介绍 2、JSON语法 3、实践总结 运行环境&#xff1a; Windows-7-Ultimate-x64、Windows-10-BusinessEditions-21h2-x64 1…

闲话Python编程-字典dict

在我的Python编程经历中&#xff0c;Python有两大最常用的数据结构&#xff1a;列表list和字典dict&#xff0c;搞明白了这两个数据结构的所有知识点&#xff0c;日常编程基本不成问题了。列表list在前面专题已经详细讲过&#xff0c;本章来着重讲解字典dict的用法。 1. 定义与…

区块链实验室(27) - 区块链+物联网应用案例

分享最新的区块链物联网应用案例&#xff1a;HPCLS-BC

【Kafka专题】Kafka快速实战以及基本原理详解

目录 前言课程内容一、Kafka介绍1.1 MQ的作用1.2 为什么用Kafka 二、Kafka快速上手2.1 实验环境2.2 单机服务体验2.3 认识Kafka模型架构2.4 Kafka集群2.5 理解服务端的Topic、Partion和Broker2.6 章节总结&#xff1a;Kafka集群的整体结构 三、Kraft集群&#xff08;拓展&#…

集群-Nacos-2.2.3、Nginx-1.24.0集群配置

Nacos集群 高可用 Nginx 集群Nacos 集群&#xff08;至少三个实例&#xff09;高可用数据库集群&#xff08;取代 Nacos 内嵌数据库&#xff09; Nacos 集群搭建 集群使用版本&#xff1a; Nginx 1.24.0 Nacos 2.2.3 服务器IP服务器版本Nginx18.18.18.40CentOS-7.9MySQL18.18.…

【计算机网络笔记七】应用层(四)HTTP 通过Content-Type提交数据的方式

1. Content-Type: application/x-www-form-urlencoded 表示纯文本表单提交方式 格式如下&#xff1a; POST /users HTTP/1.1 Host: api.github.com Content-Type: application/x-www-form-urlencoded Content-Length: 27namezhangsan&gendermale 对应的 Retrofit 代码:…

如何安装并启动jupyter notebook

jupyter是什么 Jupyter Notebook 可以使用多种语言&#xff08;Python、R、Julia 等&#xff09;开发交互式笔记本&#xff0c;因此&#xff0c;它会依赖于不同的包和库。但是&#xff0c;对于 Jupyter Notebook 的 Python 版本&#xff0c;以下是一些主要的依赖项&#xff1a…

样品运输与贮存

声明 本文是学习GB-T 42959-2023 饲料微生物检验 采样. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了以微生物检验为目的的采样原则、采样人员、设备和材料、采样方案、采样步骤和采样 报告。 本文件适用于以微生物检验为目的…