运算符重载

虚函数与运算符重载(Virtual Operator Overloading)

a 夏天 提交于 2020-01-28 21:03:52
虚函数与运算符重载(Virtual Operator Overloading) 一、相关日志 运算符重载 http://blog.163.com/zhoumhan_0351/blog/static/399542272010027113311390 多态性与虚函数 http://blog.163.com/zhoumhan_0351/blog/static/3995422720100290234430 补充运算符重载 http://blog.163.com/zhoumhan_0351/blog/static/3995422720103182106992 二、虚函数与运算符重载 1、矩阵相乘的一个例子 //: C15:OperatorPolymorphism.cpp // Polymorphism with overloaded operators #include <iostream> using namespace std; class Matrix; class Scalar; class Vector; class Math { public: virtual Math& operator*(Math& rv) = 0; virtual Math& multiply(Matrix*) = 0; virtual Math& multiply(Scalar*) = 0;

“不起眼”的运算符重载-C++

强颜欢笑 提交于 2020-01-28 08:41:36
引言 自己写程序的时候发现一个问题,别人构造的类,对象之间可以直接赋值,而我却只能求助于拷贝构造函数,这属实难顶 那应该怎么简单高效地copy类对象呢?这就轮到运算符重载登场了 干员资料 // 运算符重载简介 简单的说,运算符重载是实现编译时多态性(动态多态)的一种形式(另一种是虚函数),运算符重载是对已有运算符赋予多重含义,以适应用户自定义的数据类型的行为。 运算符重载的实质是函数重载。事实上,C++的每一个运算符对应着一个运算符函数,在实现过程中,把指定运算表达式中的运算符转化为对运算符函数的调用,而表达式中的运算对象转化为运算符函数的实参(在编译阶段完成) eg. a+b --> operator+(a,b) 可见,运算符函数的定义与其他函数的定义类似,唯一的区别是运算符函数的函数名是由关键字operator和其后的运算符构成的。 运算符函数的一般格式为: < 返回类型说明符 > operator < 运算符 > ( < 参数表 > ) { /* code */ } 特点character: 只能重载(大)部分C++提供的标准运算符,而且只能重载已有的运算符,不能自己另编。 参数个数固定,重载以后运算符的优先级和结合性都不改变,语法结构也不能改变。即对于一元运算符(前缀/后缀),有且仅有一个参数,只能重载为单目运算符;对于二元运算符(中缀),有且仅有两个参数

表达式和运算符

孤街醉人 提交于 2020-01-27 00:05:16
表达式和运算符 表达式 具有一个或多个操作数, 零个或多个运算符, 可以计算且结果为单个值、对象、方法或命名空间的代码片段。 如 i++; 其中 i 为操作数, ++ 为运算符 运算符 按操作数可以分为 一元运算符(++, new) 二元运算符(+, -, *, /) 三元运算符(条件运算符?:, 唯一一个三元运算符) 按操作类型可以分为 类型 符号表示 基本运算符 X.y, f(x), a[x], x++, x--, new, typeof, checked, unchecked, default, delegate 一元运算符 +, -, !, ~, ++x, --x, (T)x 乘除运算符 *, /, % 加减运算符 +, - 移位运算符 <<, >> 关系和类型检测运算符 <, >, <=, >=, is, as 相等运算符 ==, != 逻辑运算符 &, ^, | 条件运算符 &&, ||, ?: 赋值运算符 =, +=, -=, *=, /=, %=, &=, 其优先级从上到下依次增强, 相同优先级情况下, 左结合运算符从左到右顺序计算, 右结合运算符从右到从顺序计算. 在所有运算符当中, 赋值运算符和三元运算符是右结合运算符, 其他所有二元运算符都是左结合运算符. 建议多用括号进行优先级标记. 另一点需要注意的是,相等运算符对于值类型数据的判断

C++课程学习笔记第四周:运算符的重载

六眼飞鱼酱① 提交于 2020-01-25 17:55:12
1 运算符重载基本概念和形式 1.1 运算符重载基本概念 在数学上,两个复数可以直接进行+、-等运算。但在C++中,直接将+或-用于复数对象是不允许的,因为C++中预定义的运算符并未提供这种功能。 为了让对象也能通过运算符进行运算(这样代码更简洁,容易理解),C++提供了运算符重载的机制。 运算符重载的含义:对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。比如 5 + 4 = 9; complex_a + complex_b 生成新的复数对象。 运算符重载的目的:扩展C++中提供的运算符的适用范围,使之能作用于对象。 1.2 运算符重载的形式 返回值类型 operator 运算符(形参表){ …… } 运算符重载的实质是函数重载; 把含运算符的表达式转换成对运算符函数的调用,把运算符的操作数转换成运算符函数的参数; 运算符被多次重载时,根据实参的类型决定调用哪个运算符函数。 可以重载为普通函数,也可以重载为成员函数; 重载为成员函数时,参数个数为运算符目数减一;重载为普通函数时参数个数为运算符目数。 //示例 class Complex{ public: double real,imag; Complex( double r = 0.0, double i= 0.0 ):real(r),imag(i) { }

C#运算符重载

无人久伴 提交于 2020-01-23 14:30:40
1.运算符重载 通过运算符重载,可以对我们设计的类使用标准的运算符,例如+、-等。这称为重载,因为在使用特定的参数类型时,我们为这些运算符提供了自己的实现代码,其方式与重载方法相同,也是为同名方法提供不同的参数。 要重载运算符,可给类参加运算符类型成员(它们必须是static)。一些运算符有多种用途,因此我们还指定了要处理的多少个操作数,以及这些操作数的类型,一般情况下,操作数的类型与定义运算符的类相同,但也可以定义处理混合类型的运算符。 例如,考虑一个简单类型AddClass1,如下所示: public class AddClass1 { public int val; } 这仅是int值得一个包装器,但可以用于说明原理,对于这个类,下面的代码不能编译: AddClass1 op1 =new AddClass1(); op1.val= 3; AddClass1 op2 = new AddClass1(); op2.val=5; AddClass1 op3 = op1+op2; 其错误是+运算符不能应用于AddClass1类型的操作数,因为我们尚未定义要执行的操作。下面的代码则可执行,但无法得到预期结果: AddClass1 op1 =new AddClass1(); op1.val= 3; AddClass1 op2 = new AddClass1(); op2.val=3;

20200109

淺唱寂寞╮ 提交于 2020-01-22 21:18:43
一.回顾/预习 1.流 2.运算符重载:友元单向的、不具备传递性、不能 被继承,所以,应尽力合理使用友元。 注意:友元的声明是不受 public/protected/private 关键字限制的。 运算符重载的实质就是函数重载或函数 多态 。 运算符重载还具有以下规则: 为了防止用户对标准类型进行运算符重载, C++ 规定重载的运算符的操作对象 必须至少有一个是自定义类型或枚举类型 重载运算符之后,其优先级和结合性还是固定不变的。 重载不会改变运算符的用法,原来有几个操作数、操作数在左边还是在右边, 这些都不会改变。 重载运算符函数不能有默认参数,否则就改变了运算符操作数的个数。 重载逻辑运算符( && , || )后,不再具备短路求值特性。 不能臆造一个并不存在的运算符,如@、$等 用成员函数重载双目运算符时,左操作数无须用参数输入,而是通过隐含的 this 指针传入。 自增自减的前置与后置 明显前置形式效率更高 class Complex { public : //... //前置形式 Complex & operator ++ ( ) { ++ _real ; ++ _image ; return * this ; } //后置形式 Complex operator ++ ( int ) //int作为标记,并不传递参数 { Complex tmp ( * this ) ;

c#里的运算符重载

纵然是瞬间 提交于 2020-01-19 04:07:29
c#里的运算符重载是个不常出现的应用,同时也是个好玩的东西。 我们可以使用他来实现这样的需求: 当一个订单与另外一个订单相加形成一个新的订单。新订单的货物为两个订单的货物的并集,总价为两个订单的总价和。 下面实现看看 先做个辅助的货物类 public class Merchandise { public int Count { get; set; } public string Name { get; set; } public double UnitPrice { get; set; } }然后来实现订单类 public class Order { public double TotalPrices { get; set; } public List<Merchandise> Merchadises { get; set; } public static Order operator +(Order a, Order b) { Order newOrder = new Order() { TotalPrices = a.TotalPrices + b.TotalPrices }; newOrder.Merchadises.AddRange(a.Merchadises); newOrder.Merchadises.AddRange(b.Merchadises); return

C/C++对运算符重载详解

余生颓废 提交于 2020-01-14 12:27:12
下面来进行这段代码的分析: struct node { //定义一个结构体node(节点) int x; int y; int len; //node中有3个成员变量x,y,len bool operator <( const node &a) const { //重载<操作符。可以对两个node使用<操作符进行比较 return len<a.len; } }; 括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改! 想必看到这里对重载运算符算是有一丁点的了解吧,下面看些理论文字,更加清楚的了解关系! Return Top 重载运算符的介绍 C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。   运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) {

CSharp中的Vector结构

混江龙づ霸主 提交于 2020-01-13 13:57:46
本节将开发一个结构Vector,来演示运算符重载,这个Vector结构表示一个三维矢量。如果数学不是你的强项,不必担心,我们会使这个例子尽可能简单。三维矢量 只是三个(double)数字的一个集合,说明物体和原点之间的距离,表示数字的变量是x、y和z,x表示物体与原点在x方向上的距离,y表示它与原点在y方向上的距离, z表示高度。把这3个数字组合起来,就得到总距离。例如,如果x=3.0, y=3.0, z=1.0,一般可以写作(3.0, 3.0, 1.0),表示物体与原点在x方向上的距离是3,与原点在 y方向上的距离是3,高度为1。 矢量可以与矢量或数字相加或相乘。在这里我们使用术语"标量"(scalar),它是数字的数学用语-- 在C#中,就是一个double。相加的作用是很明显的。如果先移动(3.0, 3.0, 1.0),再移动(2.0, -4.0, -4.0),总移动量就是把这两个矢量加起来。矢量的相加是指把每个元素分别相加,因此得到(5.0, -1.0,-3.0)。此时,数学表达式总是写成c=a+b,其中a和b是矢量,c是结果矢量。这与使用Vector结构的方式是一样的。 注意: 这个例子是作为一个结构来开发的,而不是类,但这并不重要。运算符重载用于结构和类时,其工作方式是一样的。 下面是Vector的定义-- 包含成员字段、构造函数和一个ToString()重写方法

c++运算符重载

坚强是说给别人听的谎言 提交于 2020-01-13 13:49:21
为什么要重载运算符? 如果不做特殊处理,C++ 的 +、-、*、/ 等运算符只能用于对基本类型的常量或变量进行运算,不能用于对象之间的运算。 有时希望对象之间也能用这些运算符进行运算,以达到使程序更简洁、易懂的目的。例如,复数是可以进行四则运算的,两个复数对象相加如果能直接用+运算符完成,不是很直观和简洁吗? 利用 C++ 提供的“运算符重载”机制,赋予运算符新的功能,就能解决用+将两个复数对象相加这样的问题。 运算符重载,就是对已有的运算符赋予多重含义,使同一运算符作用于不同类型的数据时产生不同的行为。运算符重载的目的是使得 C++ 中的运算符也能够用来操作对象。运算符重载的实质是编写以运算符作为名称的函数。 //一 struct Node { int x , y ; bool operator < ( const Node & w ) const { //重载了小于符号 if ( y == w . y ) return x < w . x ; return y < w . y ; } } e [ 20 ] ; sort ( e + 1 , e + n + 1 ) ; //重载了<运算符才能进行结构体之间的比较 /*加const是因为: 我们不希望在这个函数中对用来进行赋值的“原版”做任何修改。函数加上const后缀的作用是表明函数本身不会修改类成员变量。 加上const