08 c++中运算符重载(未完成)
参考:轻松搞定c++语言
定义:赋予已有运算符多重含义,实现一名多用(比较函数重载)
运算符重载的本质是函数重载
重载函数的格式:
函数类型 operator 运算符名称(形参表列) {
重载实体;
}
比如:
const Complex operator+(const Complex &c1,const Complex &c2);
友元函数的重载:
#include <iostream>
using namespace std; class Complex
{
public:
Complex(float x=, float y=) :_x(x),_y(y){}
void dis()
{
cout<<"("<<_x<<","<<_y<<")"<<endl;
}
friend const Complex operator+(const Complex &c1,const Complex &c2);
private:
float _x;
float _y;
};
const Complex operator+(const Complex &c1,const Complex &c2)
{
return Complex(c1._x + c2._x,c1._y + c2._y);
}
int main()
{
Complex c1(,);
Complex c2(,); c1.dis();
c2.dis();
Complex c3 = c1+c2;
//Complex c3 = operator+(c1,c2);
c3.dis();
return ;
}
成员重载:
#include <iostream> using namespace std; class Complex
{
public:
Complex(float x=, float y=) :_x(x),_y(y){}
void dis() {
cout<<"("<<_x<<","<<_y<<")"<<endl;
}
friend const Complex operator+(const Complex &c1,const Complex &c2);
const Complex operator+(const Complex &another);
private:
float _x;
float _y;
};
const Complex operator+(const Complex &c1,const Complex &c2)
{
cout<<"友元函数重载"<<endl;
return Complex(c1._x + c2._x,c1._y + c2._y);
}
const Complex Complex::operator+(const Complex & another)
{
cout<<"成员函数重载"<<endl;
return Complex(this-‐>_x + another._x,this-‐>_y + another._y);
}
int main()
{
Complex c1(,);
Complex c2(,);
c1.dis();
c2.dis(); //Complex c3 = c1+c2;
//Complex c3 = operator+(c1,c2);
Complex c3 = c1+c2;
c3.dis();
return ;
}
重载规则:
(1) C++不允许用户自己定义新的运算符,只能对已有的 C++运算符进行重载。

4个不可以重载的运算符:
- . (成员访问运算符)
- .*(成员指针访问运算符)
- ::(域运算符)
- sizeof(长度运算符)
- ?:(条件运算符)
(2)重载不能改变运算符运算对象(即操作数)的个数,双目运算符重载后也是双目运算符)
(3)重载不能改变运算符的优先级别。
(4)重载不能改变运算符的结合性。
如,复制运算符” =“是右结合性(自右至左),重载后仍为右结合性。
(5)重载运算符的函数不可以有默认参数
(6)重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有
一 个是类对象(或类对象的引用)。
(7)用于类对象的运算符一般必须重载,但有两个例外,运算符” =“和运算
符” &“不 必用户重载。
- 复制运算符” =“可以用于每一个类对象,可以用它在同类对象之间相互赋值,因为系统已为每一个新声明的类重载了一个赋值运算符,它的作用是逐个复制类中的数据成员。地址运算符&也不必重载,它能返回类对象在内存中的起始地址。
(8)运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非
类 的成员函数也不是友元函数的普通函数
单目运算符:(只需要一个操作符)sizeof +(正) -(负) ! ++ -- ~(位非)
双目运算符:+, -, *, /, %, <, >, >=, <=, ==, !=, <<, >>, &, ^, |, &&, ||, =
//使#用: L#R operator#(L,R); //全局函数 L.operator#(R); //成员函数
operator+=:
//作为友元函数
class A
{
int a,b;
public:
A(int x, int y) : a(x), b(y) {}
friend A operator + (const A&, const A&);
};
A operator + (const A& x, const A& y)
{
int a = x.a + y.a;
int b = x.b + y.b;
return A(a,b);
} //作为成员函数
class A
{
int a,b;
public:
A(int x, int y) : a(x), b(y) {}
A operator + (const A&);
};
A A::operator + (const A& x)
{
return A(a+x.a,
b+x.b);
}
08 c++中运算符重载(未完成)的更多相关文章
- c++中运算符重载
c++语言中运算符重载都是通过函数来实现的,所以其实质为函数重载,当c++语言原有的一个运算符被重载之后,它原来所具有的语义并没有消失,只相当于针对一个特定的类定义了一个新的运算符. <1> ...
- string类中运算符重载实现
C++中预定义的加.减等运算符的操作对象只能是基本的数据类型.如果要在用户自定义的类型对象上应用同样的运算符,就需要通过运算符重载来重新定义其实现,使它能够用于自定义类型执行特定的操作,所以运算符重载 ...
- 问题 B: 矩形类中运算符重载【C++】
题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,实现矩形加法,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. 两个矩 ...
- c++中运算符重载,+,-,--,+=,-=,*,/,*=,/=,
#include<iostream> #include<stdlib.h> using namespace std; class Complex { public: Compl ...
- Python 中的运算符重载
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 一种运算符对于不同类型的对象,有不同的使用方式.例如, + 用于整型对象,表示两个数相加:用于字符串 ...
- C++之------运算符重载
① 什么是运算符重载? 何为C++的运算符重载呢? 其实就是运算符给它重新赋予新的含义或者多重含义.让它有另外一种新的功能. 为什么需要运算符重载? 面向对象中为了实现类的多态性,我们就引用了运算符 ...
- 雷林鹏分享:C# 运算符重载
C# 运算符重载 您可以重定义或重载 C# 中内置的运算符.因此,程序员也可以使用用户自定义类型的运算符.重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的.与其 ...
- C++运算符重载的妙用
运算符重载(Operator overloading)是C++重要特性之中的一个,本文通过列举标准库中的运算符重载实例,展示运算符重载在C++里的妙用.详细包含重载operator<<,o ...
- 《挑战30天C++入门极限》C++运算符重载函数基础及其值返回状态
C++运算符重载函数基础及其值返回状态 运算符重载是C++的重要组成部分,它可以让程序更加的简单易懂,简单的运算符使用可以使复杂函数的理解更直观. 对于普通对象来说我们很自然的会频繁使用算数运 ...
随机推荐
- 打包工具Gradle
Gradle Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML.当前其支持的语言 ...
- 第1部分 Elasticsearch基础
一.安装 es端口:9200 kibana端口:5601 brew install elasticsearch brew install elasticsearch brew services sta ...
- sqlserver 创建分区表
我们知道很多事情都存在一个分治的思想,同样的道理我们也可以用到数据表上,当一个表很大很大的时候,我们就会想到将表拆 分成很多小表,查询的时候就到各个小表去查,最后进行汇总返回给调用方来加速我们的查询速 ...
- [数据结构 - 第6章] 树之二叉排序树(C语言实现)
一.什么是二叉排序树? 对于普通的顺序存储来说,插入.删除操作很简便,效率高:而这样的表由于无序造成查找的效率很低. 对于有序线性表来说(顺序存储的),查找可用折半.插值.斐波那契等查找算法实现,效率 ...
- spark 性能优化简要总结
1.从同一个数据源尽量只创建一个rdd,后续业务逻辑复用该rdd2.如果要对某个rdd进行多次的transformation或action操作,应当持久化该rdd3.从数据源读取到rdd后,要尽早的进 ...
- 如何在jupyter中使用Python2和Python3
首先通过 pip2 install ipython notebook pip3 install ipython notebook 分别安装ipython notebook,安装命令还是推荐使用国内的豆 ...
- Redis Sentinel 高可用部署实践集群
一.Redis Sentinel 介绍 1.Sentinel 数据库环境搭建,从单机版到主备.再到多数据库集群,我们需要一个高可用的监控:比如Mysql中,我们可能会采用MHA来搭建我们 ...
- openshift 使用curl命令访问apiserver
openshift版本:openshift v3.6.173.0.5 使用oc(同kubectl)命令访问apiserver资源的时候,会使用到/root/.kube/config文件中使用的配置. ...
- 2019 CSP-J 游记(CQ LNBS考场 的退役之战)
T0.10 爆零之战 已经不是第一次参加NOIP了(哦,关于兔子也NOIP了) 这次比赛的话,感觉考场很温馨,键盘很舒适,老师很友善,下次还会来.(哦不,下次来不了了,即将提前退役[大雾]) 刚刚文化 ...
- RocketMQ 4.5.1 单机环境搭建以及生产消费测试
为了学习和方便测试,总是要启动一个单机版的.下载 http://rocketmq.apache.org/dowloading/releases/ 1. 要先配置环境变量 ROCKETMQ_HOME E ...