c++之说_9_6|自定义类型 struct operator 重载运算符关键字

c++中 struct  和 class  特性几乎一模一样

所以很多都是共有的特性 篇幅就很多了

c++中  我觉得最牛皮的概念之一 就是

重载运算符  operator 关键字

这个东西 能将  我们的  运算符 (+-*/) new  delete

 类型转换

写在类里面当成员函数 并制定 该类型变量运算时所适用的逻辑

以下是可重载的所有运算符:

e87c27d812124d0fb51764149ab5b02d.jpg

 这是重载运算符时的方式 注意  运算符替换掉 @

a3d662da964042a2b1ec2f1933d230df.jpg

 运算符 前缀后缀 放置位

ce19ef483ad8495285cb6213518a2bac.jpg

 限制 或 不可重载的符号

53b6a8863dcb4dc0bae42ebd328deed5.jpg


struct obj_3
{obj_3() {};obj_3(const int& Ina, const int& Inb) : a(Ina), b(Inb) {}int	geta()const { return a; };int	getb()const { return b; };private:int a = 0;int b = 0;};struct obj_1
{public:obj_1() { Ts = this;  };//使用了委托构造obj_1(const int& Ina, const int& Inb) : obj_1() { a = Ina; b = Inb; }int	geta() const { return a; };int	getb() const { return b; };
public:bool operator== (const obj_1& Target){return  (this->a == Target.a) && (this->b == Target.b);};bool operator!= (const obj_1& Target){return  !operator==(Target);};operator obj_3(){std::cout << __func__ << ":" << endl;return obj_3(99, 99);}void* operator new(std::size_t size, void* p, int io,char* c){std::cout << "obj_1::" << __func__ << "(std::size_t size, void* p,char* c) :" << endl;std::cout << "operator new 构造的地址是:" << p << endl;std::cout << "operator new   io :" << io << endl;std::cout << "operator new   c :" << c << endl;return p;}void operator delete(void* p,size_t size, const char* c){std::cout << "obj_1::" << __func__ << "(void* p,size_t size, const char* c) :" << endl;std::cout << "operator delete的地址是:" << p << endl;std::cout << "operator delete   size :" << size << endl;std::cout << "operator delete   c :" << c << endl;return;}int	operator[](int i){std::cout << "obj_1::" << __func__ << "(int i) :" << endl;std::cout << "i = "<< i << endl;return a + i;}~obj_1() {};private:obj_1* Ts;int a = 0;int b = 0;};struct obj_2
{obj_2() {};obj_2(const int& Ina, const int& Inb) : a(Ina), b(Inb) {}int	geta()const { return a; };int	getb()const { return b; };obj_2& operator= (const obj_1& Target){std::cout << "obj_2::" << __func__ << "(const obj_1& Target) :" << endl;this->a = Target.geta();this->b = Target.getb();return *this;};operator obj_1(){std::cout << "obj_2::" << __func__ << ":" << endl;return	obj_1(this->a, 100);}~obj_2() {};private:int a = 0;int b = 0;};int main()
{std::cout << __func__ <<":"<< endl;obj_1 a1(10, 1000);obj_2 b2(50, 10);obj_3 c3;obj_1 texta1;obj_2 textb2;std::cout << "初始化完各个对象的值" << endl;std::cout << "a1.a: "<<a1.geta() << endl;std::cout << "a1.b: " << a1.getb() << endl;std::cout << "b2.a: " << b2.geta() << endl;std::cout << "b2.b: " << b2.getb() << endl;std::cout << "c3.a: " << c3.geta() << endl;std::cout << "c3.b: " << c3.getb() << endl;std::cout << "texta1.a: " << texta1.geta() << endl;std::cout << "texta1.b: " << texta1.getb() << endl;std::cout << "textb2.a: " << textb2.geta() << endl;std::cout << "textb2.b: " << textb2.getb() << endl;textb2 =	a1;std::cout << "该操作完成时各个变量的值" << endl;std::cout << "a1.a: " << a1.geta() << endl;std::cout << "a1.b: " << a1.getb() << endl;std::cout << "textb2.a: " << textb2.geta() << endl;std::cout << "textb2.b: " << textb2.getb() << endl;texta1 = (obj_1)b2;std::cout << "该操作完成时各个变量的值" << endl;std::cout << "b2.a: " << b2.geta() << endl;std::cout << "b2.b: " << b2.getb() << endl;std::cout << "texta1.a: " << texta1.geta() << endl;std::cout << "texta1.b: " << texta1.getb() << endl;c3 = a1;std::cout << "该操作完成时各个变量的值" << endl;std::cout << "a1.a: " << a1.geta() << endl;std::cout << "a1.b: " << a1.getb() << endl;std::cout << "c3.a: " << c3.geta() << endl;std::cout << "c3.b: " << c3.getb() << endl;std::cout << "a1[100]: " << a1[100] << endl;static char b[10] = { 0 };char p = '2';obj_1* pobj1 = ::new obj_1;obj_1* pobjw = new(b, 9000,&p) obj_1;::delete pobj1;obj_1::operator delete( pobjw,60,&p);return  0;
}

部分测试代码我已放上

接下来我们运行看看

好 我们先看看第一处

textb2 =    a1;

textb2 是obj_2类型  a1 是obj_1类型

本来两个互不相同的自定义类型是无法使用 = 运算符的

但是此刻可以了 为何讷 

就因为运算符重载 operator

我们找到 obj_2 结构体是如何定义的

我们发现 有个 

obj_2& operator= (const obj_1& Target) 函数

其中有个输出函数 我们继续来看控制台

 obj_2::operator =(const obj_1& Target) :

证明  textb2 =    a1;

的确是运行了此函数

所以  obj_2& operator= (const obj_1& Target)

这个叫什么?

这个叫重载赋值符号

Target引用的值其实就是  a1

这是类中的写法

具体详细的大家去打断点试试

------------------------------------------------------------------------------

接下来看看这个

texta1 = (obj_1)b2;

texta1 是obj_1类型  b2 是obj_2类型

这语句一看 类型转换

但是细看  不对劲  不相关类型 如何支持转换

看了下控制台  输出了obj_2::operator struct obj_1:

我们去找找 obj_2里  输出的地方

operator obj_1()

这是什么?

这叫类型转换函数

obj_2 里面有个这个  证明了 有转换到 obj_1类型的方法

它返回了一个obj_1的临时对象  

我们看看a 和 b

  b2.a: 50
     b2.b: 10

  texta1.a: 50
     texta1.b: 100

构造的临时对象中的a使用了 b2.a , b使用了 100 

看了  没错是正确的

还是不太懂?

没事 继续看看 

    c3 = a1; 

 obj_3类型 c3    obj_1类型 a1;

这题一看 哎呦  我会 刚刚学过的  重载赋值运算符嘛!

一看输出  不对劲   operator struct obj_3:

怎么是类型转换函数呢?

去 obj_3类中看看

发现并没有operator 的函数

那就去obj_1类中看看

operator obj_3()

发现了obj_3 类型转换函数

所以这题运行的是类型转换函数

--------------------------------------------------------------------

接下来我们看

 a1[100]  

这个不是数组写法吗?

a1不是 obj_1类型的对象吗?

如何能当数组用  它又输出何物?

我们去看看obj_1类中怎么写的

我们发现了   int    operator[](int i)

看见了什么 operator 关键字  又是重载运算符

这次原来是重载数组运算符

返回的是 return a + i;

看了下 输出是 110 

之前a1.a 是多少?

-----------------------------------------------------------------

接下来我们来看看

void* operator new

重载 new 与 delete

直呼woc  c++ 还有什么运算符不能重载

void* operator new(std::size_t size, void* p, int io,char* c)

当然重载new 有一定的要求:

第一个形参必须是 size_t 类型的参数

看编译报错了

一般何时我们需要重载new呢?

要在指定的空间上进行创建对象时会进行重载

比如这里

我们看到了一个 
    obj_1* pobjw = new(b, 9000,&p) obj_1;

这写法很怪异

我们注意到了

b 是一个数组变量  证明是个地址

new(b, 9000,&p)  而语句是如此

我们去看看 重载位置 obj_1类中

看到了形参顺序 std::size_t size, void* p, int io,char* c

而调用是 new(b, 9000,&p) obj_1

有输出语句 我们去看看

我们发现 b= 00007FF6B74C0E90  io = 9000    c = ’2‘

顺序是按照  new(b, 9000,&p) obj_1

至于delete 要求是 第一个形参必须为  void *

浅谈结束

大家可以去该网站看看特性 语法规则

https://zh.cppreference.com/w/cpp/language/operators

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

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

相关文章

手机屏幕生产厂污废水处理需要哪些工艺设备

随着手机行业的快速发展&#xff0c;手机屏幕生产厂的规模也越来越大&#xff0c;但同时也带来了大量的污废水排放问题。为了保护环境和人类的健康&#xff0c;手机屏幕生产厂需要采取适当的工艺设备来处理污废水。本文将介绍手机屏幕生产厂污废水处理所需的工艺设备。 首先&am…

数据据库八之 视图、触发器、事务

【零】准备数据 【1】创建表 &#xff08;1&#xff09;部门表 d_id是部门的编号d_name是部门的名字 # 确保表不存在 drop table if exists department; # 创建表 create table department( d_id int auto_increment primary key, d_name varchar(6) )auto_increment 501 …

CSS之webkit内核中的属性text-stroke

让我为大家介绍一下text-stroke 大家是否想过要弄一个描边过的文字&#xff0c;接下来&#xff0c;text-stroke就可以为你解决 text-stroke是一个复合属性&#xff0c;里面有两个参数&#xff1a;描边的尺寸 描边的颜色 <!DOCTYPE html> <html lang"en">…

【服务端性能测试】性能测试策略如何做

一、需求收集 先需要确认本次测试目的是什么&#xff0c;然后再看我们需要用什么参数来判断这个目的是否能够达成。 1.1 业务性能指标参考&#xff1a; TPS、QPS、RT、请求成功率&#xff08;一般请求成功率>99.99%&#xff09; 1.2 硬件性能指标参考&#xff1a; 即服…

【React】前端项目引入阿里图标

【React】前端项目引入阿里图标 1、登录自己的iconfont-阿里巴巴矢量图标库&#xff0c;把需要的图标加入到自己的项目中去&#xff1b;2、加入并进入到项目中去选择Symbol点击复制代码3、安装ant-design/icons4. 新建一个MyIcon.js文件内容如下5、在项目中使用 1、登录自己的i…

【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解

文章目录 0. 前言1. ROI池化的提出背景2. RoI池化的结构与工作原理3. RoI池化的作用及意义4. RoI使用示例 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方…

【Java程序设计】【C00176】基于SSM的图书管理系统(论文+PPT)

基于SSM的图书管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的图书管理系统 本系统分为前台系统、后台管理员以及后台学员3个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就…

Vim实战:使用 Vim实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

【Delphi】IDE 工具栏错乱恢复

由于经常会在4K和2K显示器上切换Delphi开发环境(IDE)&#xff0c;导致IDE工具栏错乱&#xff0c;咋样设置都无法恢复&#xff0c;后来看到红鱼儿的博客&#xff0c;说是通过操作注册表的方法&#xff0c;能解决&#xff0c;试了一下&#xff0c;果真好用&#xff0c;非常感谢分…

Unity之第一人称角色控制

目录 第一人称角色控制 &#x1f634;1、准备工作 &#x1f4fa;2、鼠标控制摄像机视角 &#x1f3ae;3、角色控制 &#x1f603;4.杂谈 第一人称角色控制 专栏Unity之动画和角色控制-CSDN博客的这一篇也有讲到角色控制器&#xff0c;是第三人称视角的&#xff0c;以小编…

Vue_Router_守卫

路由守卫&#xff1a;路由进行权限控制。 分为&#xff1a;全局守卫&#xff0c;独享守卫&#xff0c;组件内守卫。 全局守卫 //创建并暴露 路由器 const routernew Vrouter({mode:"hash"//"hash路径出现#但是兼容性强&#xff0c;history没有#兼容性差"…

Boosting semantic human matting with coarse annotations

前向推理在modelscope中开源了&#xff0c;但是训练没开源&#xff0c;且是基于TensorFlow的&#xff0c;复现起来是比较麻烦的。 1.Introduction 分割技术主要集中在像素级二元分类&#xff0c;抠图被建模为前景图像F和背景图像B的加权融合&#xff0c;大多数matte方法采用指…