C++中操作符重载的概念
1,下面的复数解决方案是否可行?
1,代码示例:
class Comples
{
public:
int a;
int b;
}; int main()
{
Complex c1 = {, };
Complex c2 = {, };
Complex c3 = c1 + c2; // error: no match for 'operator' in 'c1 + c2' return ;
}
2,重载最深层次的意义在于通过重载可以扩展系统已有的功能;
3,成员变量为公有且没有自定义构造函数的时候,可以通过大括号来分别初始 化成员变量;
2,复数的加法操作编程实验:
1,main.cpp 文件:
#include <stdio.h> class Complex
{
int a;
int b;
public:
Complex(int a = , int b = )
{
this->a = a;
this->b = b;
} int getA()
{
return a;
} int getB()
{
return b;
} friend Complex Add(const Complex& p1, const Complex& p2);
}; Complex Add(const Complex& p1, const Complex& p2)
{
Complex ret; ret.a = p1.a + p2.a;
ret.b = p1.b + p2.b; return ret;
} int main()
{ Complex c1(, );
Complex c2(, );
Complex c3 = Add(c1, c2); // c1 + c2 printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB()); return ;
}
2,输出结果:
c3.a = 4, c3.b = 6
3,思考:
1,Add 函数可以解决 Complex 对象相加的问题,但是 Complex 是现实世界中确切存在的复数,并且复数在数学中的地位和普通的实数相同;
2,为什么不能让 + 操作符也支持复数相加呢?
1,因为复数是我们自定义的类,编译器不知道这个类;
2,C++ 中扩展已有的功能可以通过重载来实现;
4,操作符重载:
1,C++ 中的重载能够扩展操作符的功能;
2,操作符的重载以函数的方式进行;
3,本质:
1,用特殊形式的函数扩展操作符的功能;
4,通过 operator 关键字可以定义特殊形式的函数;
5,operator 的本质是通过函数重载操作符;
6,语法:
1,代码示例:
Type operator Sign(const Type& p1, const Type& p2) // operator 关键字作为特殊形式函数的前缀,它直接告诉编译器,如果有两个 Type 对象做 Sign 运算,则直接调用本函数;
{
Type ret; return ret;
}
2,Sign 为系统中预定义的操作符,如:+,-,*,/等;
3,仅在定义时函数名特殊,调用时和普通函数相同;
5,操作符重载初探编程实验:
1,main.cpp 文件:
#include <stdio.h> class Complex
{
int a;
int b;
public:
Complex(int a = , int b = )
{
this->a = a;
this->b = b;
} int getA()
{
return a;
} int getB()
{
return b;
} friend Complex operator + (const Complex& p1, const Complex& p2);
}; Complex operator + (const Complex& p1, const Complex& p2)
{
Complex ret; ret.a = p1.a + p2.a;
ret.b = p1.b + p2.b; return ret;
} int main()
{ Complex c1(, );
Complex c2(, );
Complex c3 = c1 + c2; // c1 + c2 ==> operator + (c1, c2);用 “+” 来操作两个类,编译器没能力,然后编译器查找有没有用重载的概念扩展操作符的功能,于是找到了 operator +() 这个函数,如果编译器成功匹配相应的参数,则成功调用 operator +() 函数; printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB()); return ;
}
2,输出结果:
1,c3.a = 4, c3.b = 6
3,问题:
1,这里的解决方案用了友元,现代软件开发不允许;
2,是否可以提供成员函数代替全局函数,以抛弃友元?
6,可以将操作符重载函数定义为类的成员函数:
1,比全局操作符重载函数少一个参数(左操作数);
1,和全局函数最大的差异;
2,成员函数中隐藏的 this 参数可以充当左操作数的角色;
2,不需要依赖友元就可以完成操作符重载;
3,编译器优先在成员函数中寻找操作符重载函数;
1,一旦在成员函数中找到,就不会去全局找;
4,代码示例:
class Type
{
public:
Type operator Sign(const Type& p) // 左操作数用 this;
{
Type ret; return ret;
}
};
7,成员函数重载操作符编程实验:
1,main.cpp 文件:
#include <stdio.h> class Complex
{
int a;
int b;
public:
Complex(int a = , int b = )
{
this->a = a;
this->b = b;
} int getA()
{
return a;
} int getB()
{
return b;
} Complex operator + (const Complex& p)
{
Complex ret;
printf("Complex operator + (const Complex& p)\n");
ret.a = this->a + p.a;
ret.b = this->b + p.b; return ret;
} friend Complex operator + (const Complex& p1, const Complex& p2);
}; Complex operator + (const Complex& p1, const Complex& p2)
{
Complex ret;
printf("Complex operator + (const Complex& p1, const Complex& p2)\n");
ret.a = p1.a + p2.a;
ret.b = p1.b + p2.b; return ret;
} int main()
{ Complex c1(, );
Complex c2(, );
Complex c3 = c1 + c2; // c1 + c2 ==> c1.operator + (c2) printf("c3.a = %d, c3.b = %d\n", c3.getA(), c3.getB()); return ;
}
2,输出结果:
Complex operator + (const Complex& p)
c3.a = 4, c3.b = 6
8,小结:
1,操作符重载是 C++ 的强大特性之一;
2,操作符重载的本质是通过函数扩展操作符的功能;
3,operator 关键字是实现操作符重载的关键;
4,操作符重载遵循相同的函数重载规则;
5,全局函数和成员函数都可以实现对操作符的重载;
C++中操作符重载的概念的更多相关文章
- 关于C++中操作符重载的疑问 :四个运算符=, ->, [], ()不可以重载为全局函数(友员函数)
转载自:http://blog.csdn.net/u014610226/article/details/47679323 以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需 ...
- C++基础学习笔记----第十三课(操作符重载-下)
本节主要讲使用成员函数重载操作符,包括[],=,(),->四种操作符的重载以及&&和||的问题. 类的成员函数进行操作符重载 基本概念 类的成员函数也可以进行操作符的重载.类的普 ...
- C++基础 (4) 第四天 this指针 全局函数和成员函数 友元 操作符重载
1static强化练习-仓库进货和出货 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; c ...
- C++中采用操作符重载完善复数类
1,复数类应该具有的操作: 1,运算:+,-,*,/: 2,比较:==,!=: 3,赋值:=: 4,求模:modulus: (5),完善的复数类操作符重载必不可少: 2,利用操作符重载: 1,统一复数 ...
- C#中如何利用操作符重载和转换操作符
操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...
- C++中的操作符重载
一.什么是操作符重载 操作符重载可以分为两部分:“操作符”和“重载”.说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载.运算符重载和函数重载的不同之处在于操作符重载 ...
- delphi 中record 的类操作符重载简介
今天简单介绍一下 delphi 中record 的类操作符重载使用,就是如何 实现 record 之间的简单操作. 关于类操作符重载 ,大家可以看官方的文档. Delphi allows certai ...
- Python中的操作符重载
运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果. 类可以重载python的操作符 操作符重载使我们的对 ...
- 【C++】C++中的操作符重载
C++中的操作符重载使得对于类对象的操作更加方便和直观,但是对于各种操作符重载的规则以及语法形式,一直以来都是用到哪一个上stackoverflow上查找,在查找了四五次之后,觉得每次麻烦小总结一下. ...
随机推荐
- Java内存区域笔记(一)
程序计数器: 程序计数器是一块较小的内存空间,它可以看作当前线程所执行的字节码的行号指示器. 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令. 由于Java虚拟机的多线程 ...
- POI操作Excel(批量导出数据/下载excel)
目录 1.第一个demo:创建工作簿,创建sheet页,创建单元格 2.创建一个时间格式的单元格 3.遍历工作簿的行和列并获取单元格内容 4.文本提取 5.单元格对齐方式 ...
- 微信点餐系统(七)-微信授权获取openid:
章节小结: 1.学会了微信授权的步骤,学会了微信授权的文档 2.学会了使用natapp内网穿透工具 3.加深了虚拟机的网络配置以及基本使用 4.学会了抓包购票工具fiddler的使用 5.微信授权步骤 ...
- POJ 2155 Matrix (树状数组 && 区间计数)
题意 : 给出一个N*N的矩阵, 矩阵只有可能包含0或1, 一开始则全部是0.对于矩阵可以进行两种操作, 第一种是输入 C x1 y1 x2 y2 表示, 对以(x1, y1)为左上角, 以(x2, ...
- BZOJ 3143 Luogu P3232 [HNOI2013]游走 (DP、高斯消元)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3143 (luogu) https://www.luogu.org/pro ...
- 源码阅读-JLRoutes路由设置
最后更新: 2018-1-20 JLRoutes 是在 github 上 Star 比较多的一个, 在各大平台也有介绍, 一些知识可以参考到下面的连接查看. 本文仅仅作为我的思考以及对应的心得; 一. ...
- 2-sat问题简记
关于2-sat问题,这里笔者主要是做一些简记,如要详细了解,可以读一读此dalao的文章:https://blog.csdn.net/jarjingx/article/details/8521690 ...
- maven 私服的setting.xml配置
<?xml version="1.0" encoding="UTF-8"?> 2 <settings xmlns="http://m ...
- ClientScriptManager.RegisterClientScriptBlock Method 无效
ClientScriptManager.RegisterClientScriptBlock Method 这个方法不能在Render方法里面使用,但是可以在PreRender中使用 最好是放到OnLo ...
- NDK下编译JNI
NDK环境下编译JNI 下载demo.tar.gz然后解压 弄个套路 1.编辑build.sh设置好NDK目录 2.把cpp文件放到code下面 运行sh build.sh即可