运算符重载说明

这次我们通过来自定义数组类型重载[]、<<、>>、==、!=运算符来学习C++运算符重载相关知识

C++的运算符重载是C++相对于其他编程语言的一大特色

在C++里面,我们用class自定义一个类型后,为啥可以直接使用 = 赋值运算符呢?因为 C++自动为我们做了这个动作,

我们定义的类型中没有显示定义=运算符,它会自动为我们添加默认的operator=重载函数。

我们进行运算符重载是应该改变其原来的意义!比如说原来是加的含义,你给重载为减的含义那就不应该了。

运算符重载方式

进行运算符重载有2种方式。

第一种:将运算符重载放在全局函数,这种方式的函数参数,至少有一个是我们自定义类型,不然就改变运算符的本来的意义了。

第二种:将运算符重载放在自定义class类中,这种方法方便访问类中的私有成员。第一种如果要频繁的访问类中的私有成员,可以使用将其作为类的友元函数。

友元函数说明

如果一个函数要频繁的访问类的私有成员,必须通过方法进行调用,这样会增加函数调用压栈出栈的开销,我们可以将这个函数定义为类的友元函数,这样就函数可以无私处的访问的类的私有成员了。

友元函数定义类的内部,一般是先声明后定义,和普通函数声明一样,不过在前面加一个friend 关键字

运算符重载函数的参数

如果在全局函数进行运算符重载,那么所有的参数都必须作为函数参数

如果是在类中进行运算符重载,函数中自动会把运算符操作的对象作为this指针传入的函数中,所以参数会少一个。如果我们要对传送的参数进行修改,如果是的c话只能传指针,c++为了更方便我们开发,添加了引用,一般我们使用引入传递。如果不是引用传递 修改只会对参数副本进行修改不会影响原对象。

运算符重载函数的返回值

返回值应该根据这个运算符运算之后的结果来确定。打个比方比如前置运算符++,可以++++a吧,那么返回值一定可以在原来的基础上继续进行改变,这样的返回值我们一般返回引用。就好比 我们重载<<运算符 返回的是ostream的引用 这样我们就可以连续使用 << 操作符了。

代码展示

代码中重载了[]、<<、>>、==、!=运算符和友元函数的使用。

MyArray.h

#pragma once
#ifndef __MY_ARRAY_H__
#define __MY_ARRAY_H__
#include <iostream>
using namespace std;class MyArray
{
public:MyArray();MyArray(int len);MyArray(const MyArray &another);int getData(int index);void setData(int index, int data);int getLengh();//重载cout<<运算符 cout<< arr1 << arr2friend ostream& operator<<(ostream &cout,MyArray& myArray);//重载cout>>运算符 cin >> arr1 实现对数组元素的输入friend istream& operator >> (istream &cin, MyArray& myArray);//重载赋值操作符MyArray& operator=(MyArray& another);//重载下标操作符int& operator[](int index);//重载==操作符bool operator==(MyArray& another);bool operator!=(MyArray& another);~MyArray();private:int len;int* arr;
};
#endif // !__MY_ARRAY_H__

MyArray.cpp

#include <cstdio>
#include <iostream>
#include <ostream>
#include "MyArray.h"
using namespace std;MyArray::MyArray()
{this->len = 0;this->arr = NULL;
}MyArray::MyArray(int len)
{this->len = len;this->arr = new int[len];memset(this->arr, 0, sizeof(int)*len);
}
MyArray::MyArray(const MyArray& another)
{this->len = another.len;this->arr = new int[this->len];for (size_t i = 0; i < this->len; i++){this->arr[i] = another.arr[i];}
}int MyArray::getData(int index)
{return this->arr[index];
}void MyArray::setData(int index, int data)
{this->arr[index] = data;
}int MyArray::getLengh()
{return this->len;
}ostream& operator<<(ostream &cout, MyArray& myArray)
{cout << "[";for (size_t i = 0; i < myArray.len-1; i++){cout << myArray.arr[i] <<",";}cout << myArray.arr[myArray.len - 1] << "]" << endl;return cout;
}istream& operator >> (istream &cin, MyArray& myArray)
{cout << "请输入" << myArray.len << "个数字:" << endl;for (size_t i = 0; i < myArray.len; i++){int d = 0;cin >> d;myArray.arr[i] = d;}return cin;
}MyArray & MyArray::operator=(MyArray & another)
{//1、防止自身赋值if (this == &another){return *this;}//2、将自身开辟的空间回收if (this->arr != NULL){delete this->arr;this->arr = NULL;this->len = 0;}//3、执行深拷贝this->len = another.len;this->arr = new int[another.len];for (size_t i = 0; i < this->len; i++){this->arr[i] = another.arr[i];}//4、返回本身return *this;
}int & MyArray::operator[](int index)
{return this->arr[index];
}bool MyArray::operator==(MyArray & another)
{if (this == &another){return true;}if (this->len != another.len){return false;}for (size_t i = 0; i < another.len; i++){if (another.arr[i] != this->arr[i]){return false;}}return true;
}bool MyArray::operator!=(MyArray & another)
{return !(*this==another);
}MyArray::~MyArray()
{this->len = 0;delete[] this->arr;
}

main.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include "MyArray.h"
using namespace std;int main(int argc, char *argv[])
{MyArray arr1(10);cout << arr1 << arr1;cin >> arr1;cout<<"arr1:" << arr1;MyArray arr2 = arr1;cout <<"MyArray arr2 = arr1\narr2:"<< arr2;cout << "arr2 == arr1:" << boolalpha << (arr2 == arr1) << endl;cout << "arr2 != arr1:" << boolalpha << (arr2 != arr1) << endl;arr2[9] = 666;cout << "arr2[9] = 666\narr2:" << arr2;cout << "arr2 == arr1:" << boolalpha << (arr2 == arr1)<<endl;cout << "arr2 != arr1:" << boolalpha << (arr2 != arr1) << endl;return 0;
}

验证结果

C++实现:自定义数组类型实现相关运算符重载相关推荐

  1. 转换构造函数与类型构造函数与运算符重载函数

    #include <iostream> using namespace std; class complex { public:complex(){real=0;image=0;}comp ...

  2. 从自定义string类型理解右值引用

    理解右值引用 前言 问题复现 自定义string(CMyString) 遇到问题 图示理解 右值引用 什么是右值 添加右值引用参数的成员方法 结果对比 解决遗留问题 前言 在之前,我写过一篇: 通过自 ...

  3. C++中的运算符重载

    1.Cpp中的重载运算符和重载函数 C++允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但 ...

  4. 北大郭炜《程序设计与算法(三)》Mooc笔记:运算符重载和继承

    文章目录 运算符重载 运算符重载的基本概念 赋值运算符的重载 为什么引入赋值运算符重载? 浅拷贝和深拷贝 对operator=返回值的讨论 复制构造函数的相同困境 运算符重载为友元函数 实例:可变长数 ...

  5. 06C++运算符重载

    C++运算符重载 什么是运算符重载 赋予运算符具有操作自定义类型数据功能 运算符重载的实质是什么? 运算符重载的实质本身就是函数调用 运算符重载函数的写法函数返回值 函数名(函数参数) 函数返回值 : ...

  6. Java为什么不提供运算符重载?

    从C ++到Java,一个显而易见的未解决问题是Java为什么不包括运算符重载? 不是Complex a, b, c; a = b + c;吗Complex a, b, c; a = b + c; C ...

  7. c++运算符重载与输入输出流重载

    运算符重载 运算符重载--赋予运算符具有操作自定义类型数据功能 运算符重载本身也是一种函数,我们有两种写法--友元类运算符重载函数和类运算符重载 运算符重载的实质本身就是函数调用 我们要注意它的写法: ...

  8. 【唐老狮】C#——封装:运算符重载

    ​    ​目前我们学过的变量中,除了几种自定义的变量(结构体.类.枚举),语言本身的13种常用变量类型byte.int.float等等都默认支持用运算符进行计算,也支持条件运算符进行比较.今天我们要 ...

  9. C++ 自定义string类 重载相关运算符

    c++提供的string类 c++提供的string类可以做很多事情,它本质上是也是类,它的很多运算符都是通过重载进行实现的. 今天我们自己来简单来实现MyString类来模拟 string类能做得一 ...

最新文章

  1. 小米立Flag:要做年轻人的第一个深度学习框架
  2. linux c 内存泄漏调试工具 《valgrind用户手册》 2. 使用和理解Valgrind核心
  3. guava之ComparisonChain
  4. 关于python 类的使用
  5. asp2.0缓存概述
  6. hql可以使用distinct吗_输送食品可以使用白色PVC输送带吗?
  7. wifiwan口速率什么意思_无线路由器怎么设置wan口速率
  8. 现代程序设计 作业7 - 更加简单的题目
  9. HTML元素 - input type=hidden
  10. 自定义View以及事件分发总结
  11. Android多媒体学习一:Android中Image的简单实例。
  12. cc2640r2f i2c接口_TI最新CC2640R2L与CC2640R2F区别详解
  13. 韦东山freeRTOS系列教程之【第八章】事件组(event group)
  14. 文本处理及正则表达式
  15. 《修炼——我的职场十年》 摘录
  16. 十一黄金周旅游线路排行榜(图文)
  17. win10 nginx部署前端项目(静态资源服务器和HTML)
  18. python简笔画程序_社会了,教小白如何用Python画出小猪佩琪!
  19. 非常实用的12条 SQL 优化方案
  20. 什么事aop,aop的作用是什么?aop在项目哪里使用到了

热门文章

  1. mac hosts文件已锁定无法修改怎么办?hosts修改权限设置教程
  2. java jvm 查看内存_JVM:查看java内存情况命令
  3. P1422 小玉家的电费--2022.03.15
  4. php把时间戳转换成多少时间之前函数
  5. python3类的继承详解_python3 多重继承机制
  6. 手把手带你入门Python爬虫(二、爬虫预备知识)
  7. 基于php的选课系统设计(含源文件)
  8. HTTP笔记-浏览器是如何识别点击的链接是下载文件还是展示页面
  9. Linux学习笔记-线程的自然终止
  10. linux查看redis表内所有数据,Redis数据库(list类型)