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上查找,在查找了四五次之后,觉得每次麻烦小总结一下. ...
随机推荐
- 常用cmd命令总结
1.常用操作 cls #清屏set #查看环境变量cd #切换工作目录 (换盘:直接输入 C: 或 D:)cd.. #返回上级目录exit #关闭cmd窗口 2.有关Python pip instal ...
- 【leetcode】Find Largest Value in Each Tree Row
You need to find the largest value in each row of a binary tree. Example: Input: 1 / \ 3 2 / \ \ 5 3 ...
- Qt第三方库----QCustomPlot
一.软件下载 下载地址:http://www.qcustomplot.com/index.php/download 这里推荐下载第一个链接的内容: 注:这里的第三方库要放在非中文目录下. 二.配置 ( ...
- 视图:setContentView()
1.setContentView的作用是将View加载到根view之上,这样当显示view时,先显示根view,然后在显示子view,以此类推,最终将所有view显示出来. 2.setContentV ...
- 编译依赖ndt_gpu库的包,遇到Eigen报错
背景: 使用NDT建图,帧率比较慢,打算使用gpu加速计算. ndt_gpu是一个使用gpu加速ndt计算的库,首先在工作空间编译这个包. 然后在ndtMap包中链接这个库,其CMakelists.t ...
- 用JavaServiceWrapper将JAVA程序发布成Windows服务
怎么把jar文件做成系统服务,比较多的解决方案是使用 wrapper-windows 这个软件包.这个软件包的强大之处是能把jre环境也给打进去,这个服务可以正常运行在根本没有jre环境即就没有安装J ...
- 激活navicat premium12
按Win键和R键打开运行并输入cmd并回车或Win10 开始菜单右键,打开命令提示符或者命令提示符(管理员) ,建议使用命令提示符(管理员) 最为稳妥. 1.首先使用cd命令切换到当前Navicat ...
- CDH搭建和集成spark、kafka操作
系统:Centos7 CDH版本:5.14.0 请自己提前安装好:mysql.jdk 并下载好相关依赖(每一台机器) yum -y install chkconfig python bind-util ...
- leetcode-mid-design-297. Serialize and Deserialize Binary Tree¶-NO -??
mycode 将list转换成树的时候没有思路 参考: deque 是双边队列(double-ended queue),具有队列和栈的性质,在 list 的基础上增加了移动.旋转和增删等 class ...
- Python深度学习读书笔记-5.Keras 简介
Keras 重要特性 相同的代码可以在 CPU 或 GPU 上无缝切换运行. 具有用户友好的 API,便于快速开发深度学习模型的原型. 内置支持卷积网络(用于计算机视觉).循环网络(用于序列处理)以及 ...