C++(三十五) — 运算符重载
运算符重载的实质:函数重载。除了增加一个关键字 operator 外,与函数重载没有区别,都是通过该类的某个对象来访问重载运算符。
(1)重载运算符时,运算符运算顺序和优先级不变,操作数个数不变;
(2)不能创造新的运算符;
(3)形式:重载为类的成员函数。对象本身就是其中的一个操作数,所以形参表内参数的数目比操作数的数目少一个。
重载为类的友元函数。一元运算符有一个形参;二元运算符有两个形参;每个形参代表运算符的一个操作数。
1、友元函数和成员函数的应用举例,一般情况下应用成员函数。
#include <iostream>
using namespace std; class Complex
{
public:
Complex(int a = , int b = )
{
this->a = a;
this->b = b;
}
void printCom()
{
cout << a << " + " << b << "i" << endl;
}
public:
// 友元函数实现,必须和实现的完全一样
friend Complex operator+(Complex &c1, Complex &c2);
friend Complex& operator++(Complex &c1);
friend Complex operator++(Complex &c1, int);
friend ostream& operator<<(ostream &out, Complex &c1);
//friend void operator<<(ostream &out, Complex &c1); //成员函数法实现 - 号运算符重载
Complex operator-(Complex &c2)
{
Complex tmp(a - c2.a, b - c2.b);
return tmp;
}
//成员函数实现 前置-- 操作
Complex& operator--()
{
a--; b--;
return *this;
}
//成员函数实现 后置-- 操作,与 前置-- 使用占位符进行区别。
Complex operator--(int)
{
Complex tmp = *this;
a--; b--;
return tmp;
}
private:
int a, b;
}; //友元函数实现 + 号运算符重载
Complex operator+(Complex &c1, Complex &c2)
{
Complex tmp(c1.a + c2.a, c1.b + c2.b);
return tmp;
}
// 友元函数实现 一元运算符 重载,前置++
Complex& operator++(Complex &c1)
{
c1.a++;
c1.b++;
return c1;
}
// 友元函数实现 一元运算符 重载,后置++
Complex operator++(Complex &c1, int)
{
Complex tmp = c1;
c1.a++;
c1.b++;
return tmp;
} void main()
{
Complex c1(, ), c2(, );
//1、全局函数实现,对于私有成员使用了友元函数。
Complex c3 = c1 + c2;
c3.printCom();
//2、成员函数实现
Complex c4 = c1 - c2;
c4.printCom(); //3、全局函数实现,前置++
++c1;
c1.printCom();
//4、成员函数实现,前置--
--c1;
c1.printCom(); //5、全局函数实现,后置++
Complex c5 = c1++;
c5.printCom();
c1.printCom();
//6、成员函数实现,后置--
Complex c6 = c1--;
c6.printCom();
c1.printCom(); system("pause");
}
2、友元函数的应用场景,左移右移操作符的重载。
//只能使用友元函数实现左移、右移操作运算符
/*oid operator<<(ostream &out, Complex &c1)
{
out << c1.a << " + " << c1.b << "i" << endl;
}*/
//只能使用友元函数实现左移、右移操作运算符
ostream& operator<<(ostream &out, Complex &c1)
{
out << c1.a << " + " << c1.b << "i" << endl;
return out;
} void main()
{
int a = ;
Complex c1(, ), c2(, );
//cout << c1;
cout << c1 << "abv" << endl;
system("pause");
}
C++(三十五) — 运算符重载的更多相关文章
- JAVA之旅(三十五)——完结篇,终于把JAVA写完了,真感概呐!
JAVA之旅(三十五)--完结篇,终于把JAVA写完了,真感概呐! 这篇博文只是用来水经验的,写这个系列是因为我自己的java本身也不是特别好,所以重温了一下,但是手比较痒于是就写出了这三十多篇博客了 ...
- centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课
centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件.目录属性 shell数组简单用法 $( ) 和$ ...
- NeHe OpenGL教程 第三十五课:播放AVI
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Java进阶(三十五)java int与integer的区别
Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...
- Gradle 1.12用户指南翻译——第三十五章. Sonar 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关
开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...
- “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Python进阶(三十五)-Fiddler命令行和HTTP断点调试
Python进阶(三十五)-Fiddler命令行和HTTP断点调试 一. Fiddler内置命令 上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的se ...
- 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码
第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...
- sdut 面向对象程序设计上机练习十(运算符重载)
面向对象程序设计上机练习十(运算符重载) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 定义一个复数类Complex,重载运算符"+" ...
随机推荐
- Pytorch IO提速
1. 把内存变成硬盘,把需要读的数据塞到里面去,加快了io. Optimizing PyTorch training code 如何给你PyTorch里的Dataloader打鸡血 轻轻松松为你的Li ...
- 关于Excel 2016 总要点击两次才能打开的解决方法
1.快捷键:win+r,输入:regedit2.定位到如下项目“HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open\command”:3.编辑原有的内容,在最后添加 ...
- Github首次使用教程(本地新建项目并同步到Github远程仓库)
网上关于Github的教程很多且有点乱,自己亲自躺坑实践,现分享出来给将要入坑的小伙伴. 主要步骤: 创建Github帐号,登录,新建仓库(远程仓库) 下载安装Git,git bash配置及简单使用( ...
- Influx Sql系列教程三:measurement 表
在influxdb中measurement相当于mysql中的表,可以理解为一条一条记录都是存与measurent中的,一个数据库中可以有多个measurement,一个measurement中可以存 ...
- 【面试】C++类中的相关函数【构造,拷贝构造,析构,友元】
构造函数:值的初始化,可带参数,无返回值,可重载,可存在多个 析构函数:释放对象内存空间,无参数,无返回值,不可重载,只能存在一个 拷贝构造函数:拷贝对象,其形参必须是引用 1.空类会默认添加哪些东西 ...
- pyhton数据类型:字典、集合、列表、元组
基本常识 元组 列表 字典 集合 初始化 tuple=(1,2,3,4) list=[1,2,3,4] dic={'a':12,'b':34} set={1,2,3,4} 元素索引 tuple[0] ...
- 动态字节码技术Javassist
字节码技术可以动态改变某个类的结构(添加/删除/修改 新的属性/方法) 关于字节码的框架有javassist,asm,bcel等 引入依赖 <dependency> <groupI ...
- 【C#】上机实验七
.开发一个窗体应用程序,窗体上能接收华氏温度或者摄氏温度,点击相应按钮可以相互转换. 要求转换后的华氏温度或者摄氏温度保留小数点后3位,程序中要有异常处理结构. using System; using ...
- Unity项目 - 简单时钟 Clock
项目展示 Github项目地址:简单时钟 Clock 制作流程 表盘绘制: 采用Aseprite 像素绘图软件绘制表盘及指针.本例钟表素材大小 256x256,存储格式为png,但发现导入Unity后 ...
- 上传自己的 NuGet 包
参考:https://blog.csdn.net/gulijiang2008/article/details/41724927 STEP 1:在NuGet上注册并获取API Key STEP 2:下载 ...