当前位置: 首页 > 编程日记 > 正文

4.0 C++远征:重载运算符

目录

  • 重载运算符
    • 四、重载运算符
      • 1.一元运算符重载
      • 2.二元运算符重载

重载运算符

四、重载运算符

概念 : 给原有运算符赋予新功能。

本质 : 函数重载。

关键字 : operator

1.一元运算符重载

符号只与一个操作数进行运算。

Ⅰ -(负号)的重载(取反啊)

  • 友元函数重载

    // Coordinate.hpp
    class Coordinate {  friend Coordinate& operator-(Coordinate &coor);public:Coordinate(int x, int y);private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate& Coordinate::operator-(Coordinate &coor) {coor.m_iX = -coor.m_iX;coor.m_iY = -coor.m_iY;return *this;
    }// main.cpp
    int main() {Coordinate coor(3, 5);-coor;    // operator-(coor);return 0;
    }

  • 成员函数重载

    // Coordinate.hpp
    class Coordinate {public:Coordinate(int x, int y);Coordinate& operator-();    // 有this指针private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate& Coordinate::operator-() {m_iX = -m_iX;m_iY = -m_iY;return *this;
    }// main.cpp
    int main() {Coordinate coor(3, 5);-coor;    // coor.operator-();return 0;
    }

Ⅱ ++符号的重载

  • 前置++符号重载

    // Coordinate.hpp
    class Coordinate {public:Coordinate(int x, int y);Coordinate& operator++();   // 前置++private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate& Coordinate::operator++() {m_iX++;m_iY++;return *this;
    }// main.cpp
    int main() {Coordinate coor(3, 5);++coor;   // coor.operator++();return 0;
    }
  • 后置++符号重载

    // Coordinate.hpp
    class Coordinate {public:Coordinate(int x, int y);Coordinate operator++(int); // 后置++(int用来标识当前的++是后置重载,并不接受任何入参)private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate Coordinate::operator++(int) {Coordinate oldCoor(*this);m_iX++;m_iY++;return oldCoor;
    }// main.cpp
    int main() {Coordinate coor(3, 5);coor++;   // coor.operator++(0);return 0;
    }

2.二元运算符重载

符号与两个个操作数进行运算。

Ⅰ +(加号)的重载

  • 友元函数重载

    // Coordinate.hpp
    class Coordinate {friend Coordinate operator+(const Coordinate &coor1, const Coordinate &coor2);public:Coordinate(int x, int y);private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate operator+(const Coordinate &coor1, const Coordinate &coor2) {Coordinate tempCoor;tempCoor.m_iX = coor1.m_iX + coor2.m_iX;tempCoor.m_iY = coor1.m_iY + coor2.m_iY;return tempCoor;
    }// main.cpp
    int main() {Coordinate coor1(3, 5);Coordinate coor2(4, 6);Coordinate coor3(0, 0);coor3 = coor1 + coor2;    // coor3 = operator+(coor1, coor2);return 0;
    }

  • 成员函数重载

    // Coordinate.hpp
    class Coordinate {public:Coordinate(int x, int y);Coordinate operator+(const Coordinate &coor);private:int m_iX;int m_iY;
    };// Coordinate.cpp
    Coordinate operator+(const Coordinate &coor) {Coordinate tempCoor;tempCoor.m_iX = this->m_iX + coor.m_iX;tempCoor.m_iY = this->m_iY + coor.m_iY;return tempCoor;
    }// main.cpp
    int main() {Coordinate coor1(3, 5);Coordinate coor2(4, 6);Coordinate coor3(0, 0);coor3 = coor1 + coor2;    // coor3 = coor1.operator+(coor2);return 0;
    }

Ⅱ <<号的重载

  • 友元函数重载

    // Coordinate.hpp
    #include <ostream>
    using namespace std;
    class Coordinate {friend ostream &operator<<(ostream &output, const Coordinate &coor);public:Coordinate(int x, int y);private:int m_iX;int m_iY;
    };// Coordinate.cpp
    ostream &operator<<(ostream &output, const Coordinate &coor) {output << coor.m_iX << ", " << coor.m_iY << endl;return output;
    }// main.cpp
    int main() {Coordinate coor(3, 5);cout << coor; // operator<<(cout, coor);return 0;
    }
  • 输出运算符可以采用成员函数重载吗?

    不可以。

    因为重载输出运算符的第一个参数必须是ostream &out,而若写成成员函数必须是this指针。

Ⅲ [](索引)的重载

// Coordinate.hpp
class Coordinate {public:Coordinate(int x, int y);  int operator[](int index);private:int m_iX;int m_iY;
};// Coordinate.cpp
int operator[](int index) {if(index == 0)return m_iX;if(index == 1)return m_iY;
}// main.cpp
int main() {Coordinate coor(3, 5);cout << coor[0];  // coor.operator[](0);cout << coor[1];  // coor.operator[](1);return 0;
}
  • 索引运算符可以采用友元函数重载吗?

    不可以。

    因为索引运算符的第一个参数必须是this指针。

转载于:https://www.cnblogs.com/xiaoqingyang/p/6077603.html

相关文章:

django权限系统实现步骤_Django密码系统实现过程详解

一、Django密码存储和加密方式#算法迭代盐加密$$$默认加密方式配置#settings里的默认配置PASSWORD_HASHERS [django.contrib.auth.hashers.PBKDF2PasswordHasher,django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher,django.contrib.auth.hashers.Argon2PasswordHasher,dja…

比特币核心概念及算法

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 bitcoin项目地址位于github仓库&#xff0c;当前各种“币”&#xff0c;基本都是从抄写bitcoin代码开始起步的。想要深度研究&#xff0c;从看源码…

【php增删改查实例】第十七节 - 用户登录(1)

新建一个login文件&#xff0c;里面存放的就是用户登录的模块。 <html><head><meta charset"utf-8"><style type"text/css"></style><script type"text/javascript"></script></head><body&…

mysqlselectdb php_PHP MySQL Select(数据库查询)

SELECT 语句用于从数据库中选取数据。语法SELECT column_name(s) FROM table_name注释&#xff1a;SQL 语句对大小写不敏感。SELECT 与 select 等效。column_name(s)表示查询字段&#xff0c;可以是一个或多个&#xff0c;* 表示查询所有字段&#xff0c;table_name指数据表的名…

比特币和加密货币入门

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 比特币与加密货币 现在人们对加密货币空间产生巨大的兴趣的同时也同样也存在这疑惑与不解。比特币&#xff0c;加密货币&#xff0c;区块链&#…

有关RDS上只读实例延时分析-同适用于自建MySQL主从延时分析判断

个人不是很喜欢在技术上跟人互喷&#xff0c;尤其是不在同一个岗位上的人。一方面本人的性格如此&#xff0c;另一方面&#xff0c;我自身的口水也确实是不行&#xff0c;人生经历了第一次的双11洗礼&#xff0c;在大促的环境下&#xff0c;总算知道了有些东西是否应该规避&…

后盾网php多少钱_复合排水网价格多少钱

官方电话&#xff1a;【15266936188,0534-2138689】我公司专业生产防渗膜、土工膜、复合土工膜、土工布、隧道防水板、GCL钠基膨润土防水毯、聚酯长丝土工布等土工合成材料&#xff0c;价格合理、提供施工服务。一般情况下它不单独使用&#xff0c;因此在拉伸的过程中通常与成品…

Educational Codeforces Round 45 (Rated for Div. 2) D Graph And Its Complement(图的构造)

题意:构造一个图,使这个图的连通分量有a个,其补图的连通分量有b个,输出邻接矩阵 可以推出当min(a,b)!1时输出no ab1且n2或者n3时也为no 其余只要把一个连通分量里的x个点用x-1条边串起来就好了 哎,最后想到n3也为no,可惜了.. #include <bits/stdc.h> #define ll long…

一文读懂公有链、私有链、联盟链

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链中公有链、私有链、联盟链都是区块链技术的一个细分&#xff0c;而技术仅仅是一种工具&#xff0c;怎么在不同的场景应用好不同的工具才是技…

近20个绚丽实用的jQuery/CSS3侧边栏菜单(转载)

http://developer.51cto.com/art/201510/493530.htm 近20个绚丽实用的jQuery/CSS3侧边栏菜单 jQuery作为一款主流的JavaScript前端开发框架&#xff0c;深受广告开发者的亲睐&#xff0c;同时jQuery有着不计其数的插件&#xff0c;特别是菜单插件更为丰 富&#xff0c;本文将要…

OpenJDK 编译-Linux环境

说明&#xff1a;笔者是在Ubuntu 16.04虚拟机中编译 OpenJDK 8 源码下载 http://download.java.net/openjdk/jdk8/ 推荐直接下载openjdk-8-src-b132-03_mar_2014.zip 环境准备&#xff1a; 安装bootstrap JDK&#xff0c;笔者安装的jdk7&#xff1b; 在环境变量PATH中添加jdk的…

linux 故障注入_阿里巴巴开源故障注入工具_chaosblade

chaosblade是阿里巴巴最近开源的一款故障注入的工具&#xff0c;因为我最近在做公司的虚拟化平台的可靠性测试工具&#xff0c;无意中发现这个工具&#xff0c;个人感觉比较有用&#xff0c;用起来也比较简单&#xff0c;所以拿出来分享一下&#xff0c;期望对大家的工作和学习…

带你了解“比特币黄金”和SegWit2x分叉

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 10月25日&#xff0c;比特币黄金从比特币中分离出来创造出一个基于ASIC挖矿的数字货币。几周之后&#xff0c;比特币公司中一个重要的集团想要根据…

HTML5-用canvas画布rotate字体旋转(中国象棋棋谱)。

一开始我们老师安排我做这个作业&#xff0c;在这个作业我遇到了一个很重大的问题就是&#xff0c;文字旋转这么旋转&#xff0c;我查了很多资料。 1发现绘画正方形&#xff0c;使他正方形中心原点旋转非常容易理解。&#xff08;我相信这个很多人看一下都会懂,&#xff09; 1.…

jQuery的deferred对象详解

阮一峰大神的关于jQuery的deferred对象详解 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html 转载于:https://www.cnblogs.com/qiufang/p/8886412.html

unity3d 切换网络_Unity3d新网络请求方式UnityWebRequest详解

Unity将要逐步放弃www网络请求api&#xff0c;新的api请求方式来临&#xff1a;UnityWebRequestThe&#xff0c;也正是本篇文章要给大家介绍的重点&#xff0c;那就是UnityWebRequestThe的使用详解。旧的 www &#xff1a;https://docs.unity3d.com/ScriptReference/WWW.html新…

PoW工作量证明

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 PoW是Proof of Work的缩写&#xff0c;即工作量证明的意思。在《拜占庭将军问题》中介绍过&#xff0c;比特币系统中引入了“工作量”的概念&#…

zookeeper 集群安装

一、ZooKeeper相关概念简介&#xff1a;ZooKeeper是一个开源的、分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服…

python queue 多进程_python中的Queue与多进程(multiprocessing)

最近接触一个项目&#xff0c;要在多个虚拟机中运行任务&#xff0c;参考别人之前项目的代码&#xff0c;采用了多进程来处理&#xff0c;于是上网查了查python中的多进程一、先说说Queue(队列对象)Queue是python中的标准库&#xff0c;可以直接import 引用&#xff0c;之前学习…

postman测试上传文件

输入url&#xff1a;http://127.0.0.1:8081/uploadfile 选择post方式 选择body 选择form-data&#xff0c;text改为file 输入key&#xff1a;file &#xff0c;value&#xff1a;选择文件 send即可 转载于:https://www.cnblogs.com/shimh/p/6094410.html

区块链资产安全攻略

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 本文从钱包、密码、软件、备份、交易所、习惯几个方面给出一些指引。 钱包 每个钱包在熟练使用之前&#xff0c;请用小额测试。 有条件购买硬件钱…

win10安装docker并结合Idea2018.1部署springboot项目

一、准备工作 1.、工具&#xff1a;win10&#xff0c;idea2018&#xff0c;maven3.5&#xff0c;jdk8 二、win10安装docker 1、win10安装docker&#xff1a;http://www.runoob.com/docker/windows-docker-install.html 2、安装完毕后&#xff0c;点击小鲸鱼&#xff0c;选择set…

在桌面右键菜单,停止工作,并提示“资源管理器停止工作”等情况。

在配置文件中&#xff0c;找到右键管理菜单&#xff0c;然后删除NvCp开头的扩展项有问题&#xff0c;去掉就完事了。转载于:https://www.cnblogs.com/wangfengderizi/p/6094446.html

ue4cmd怎么调用_[UE4,automation]UE4批渲染cmd篇

之前做项目的过程中&#xff0c;有一部分工作是在UE4里制作输出小短片。由于要完成的量比较大&#xff0c;所以研究了一些批渲染的方法。逻辑上跟以前在maya里用batch render差不多&#xff0c;不过UE4这边的设置相对繁琐一点点。本文讲解了在不打开UE4软件的前提下&#xff0c…

区块链将带来怎样的应用?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 在上一篇文章中&#xff0c;咱们聊到了区块链技术正在与大数据、云计算、物联网以及人工智能这些技术链接&#xff0c;随时可能碰撞出技术创新的火…

【Spark】Spark2.x版的新特性

一、API 1. 出现新的上下文接口&#xff1a;SparkSession&#xff0c;统一了SQLContext和HiveContext&#xff0c;并且为SparkSession开发了新的流式调用的configuration API 2. 统一了DataFrame和DataSet。DataFrame相当于DataSet[Row]&#xff0c;以及DataSet的增强聚合API 3…

python基础主要内容_python基础—python的介绍

编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.这是因为计算机不能直接认识并…

Web Serveice服务代理类生成及编译

一、生成代理类 对于web service服务和wcf的webservice服务&#xff0c;我们都可以通过一个代理类来调用。 怎么写那个代理类呢&#xff1f;通过一个工具生成即可&#xff01;&#xff01;微软为我们提供了一个wsdl.exe的Web服务描述语言工具&#xff0c;wsdl.exe从 WSDL 协定文…

生成器/迭代器 和 函数的递归

生成器 一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值&#xff0c;但是yield又不同于return&#xff0c;return的执行意味着程序的结束&#xff0c;调用生成器函数不会得到返回的具体的值&#xff0c;而是得到一个可迭代的对象。每一次获取这个…

CDN -- 集合

weui https://cdnjs.cloudflare.com/ajax/libs/weui/0.4.3/style/weui.min.css 百度静态资源库 http://cdn.code.baidu.com/转载于:https://www.cnblogs.com/xuange306/p/6102407.html