社区
C# 帖子详情 请问什么叫运算符重载,为什么要重载呢? napor001 2009-03-12 04:10:32 请问什么叫运算符重载,为什么要重载呢?
...全文
682 7 打赏 收藏 请问什么叫运算符重载,为什么要重载呢? 请问什么叫运算符重载,为什么要重载呢? 复制链接
扫一扫 分享 转发到动态 举报
写回复 配置赞助广告取 消
确 定
用AI写文章 7 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 memorywang 2009-03-16 打赏举报 回复 http://baike.baidu.com/view/116893.htm liu4545533 2009-03-15 打赏举报 回复 向cppfaq致敬 fskjb01 2009-03-15 打赏举报 回复 marks deyter 2009-03-15 打赏举报 回复 mark Dobzhansky 2009-03-12 打赏举报 回复 使 运算符 具有通常上的工作方式, 可以工作在自定义类型上.
以 加号 为例, 对于内置的(基本的) 数据类型, 如 int, float, ... 执行加法运算,
如果你自己写了一个 复数类型, 具体对象是不支持加号的
但是重载一个加号执行复数加法是多么的只管呢!
同样, 其他类型如果也有这种加法的语义要求, 重载一个加号来用,
当然可以写一个 Add 函数来做这个事情.
那是口味问题了. cppfaq 2009-03-12 打赏举报 回复 http://blog.csdn.net/hustorochi/archive/2007/05/13/1607079.aspx cppfaq 2009-03-12 打赏举报 回复 重载是面向对象中的一个重要概念,它是对象多态性的一种不完全体现,人们通常所说的重载,往往指的是函数的重载。本文向读者介绍一种新的重载模型——运算符重载。
在本文中的内容:
1、为什么需要运算符重载
2、C# 运算符重载决策示例
3、C# 运算符重载一览表
4、结论
为什么需要运算符重载
函数的重载为一个对象上的相同行为提供不同的参数方式,这样,开发人员便可以使用这些不同的参数实现类似的功能。一组函数重载决策一般实现的功能是相同的,例如对 Object 对象上的 ToString() 方法就有几个重载版本,虽然它们接受的参数不同,但却都表达同一个行为的最终结果。参数的不同导致函数重载版本的签名不同,这样编译器很容易知道需要调用那一个重载版本。这种技术给开发人员带来了方便。
现在我们试图对重载的定义进行推广。先让我们看看最简单的例子,我们通常需要像这样声明并初始化一个值类型的变量:
int digit = 5;
string sayHello = "Hello, World";
这里的“=”运算符,就是将右边的值传递给左边变量的赋值运算符。这里,5 的类型为 int,“Hello, World”的类型为 string,这与左边被赋值的变量类型完全一致。
但对于上述的解释,我们还可以这样认为:5 的类型为 uint 或 byte,"Hello, World"的类型为 char[],那么如此一来,赋值运算左边和右边的类型就不在等同,那么编译器如何处理呢?有人会说,这就是“隐式类型转换”,这个答案确实很好,但隐式类型转换的规则已经被编译器确定,如果赋值运算的两端不遵循隐式类型转换规则,则需要显式类型转换,例如:
char c = '2';
string s = (string)c;
int i = (int)c;
这些显式类型转换并不适用于任何场合,也许人们希望在其自定义的类中也能用赋值、加减乘除等语法操作它们。
对象和对象之间是可能存在这种特殊的运算关系的,一个典型的例子就是“复数”对象。复数是一个值类型对象,它包含两个 double 类型的域,两个复数对象可以被加、减、乘、除和相等性判断,但无法比较大小。我们试想可以如此操作复数类:
Complex c1, c2;
c1 = new Complex(3, 4);
c2 = "4+5i";
var c3 = c1 * c2 / -c1 + c2;
if (c1 == c2) c3 = c1; else c3 = c2;
我们可以从这些代码可以预见运算符重载所需要实现的功能:
1、支持隐式类型转换和显式类型转换的重载决策。
2、支持基本二元运算符,如加、减、乘、除等。
3、支持基本一元运算符,如取负、取反、自增、自减等。
4、支持基本关系运算符,如大于、小于、等于和不等于等。
5、实现更加复杂的运算符,如三元运算、[]、()、位运算等。
事实上,运算符重载的提出就是为了解决这些问题。在 CLR 框架下的各种 CLR 语言,均不同程度的支持运算符重载。Visual Basic 在 8.0 版本上(也就是 Visual Studio 2005)也支持了运算符重载,运算符重载除了以上列出的优点外,还具备如下特点。
1、使得代码更加容易理解和阅读。
2、可以利用现有运算符的优先级关系规则处理对象之间的运算。
3、使得代码更加灵活,对象可操作性更好。
4、开发人员可以举一反三,因为他们熟悉了常规值类型上的运算符使用,这样可以直接将这些规则引入到自定义对象上。
下面我们通过介绍复数类的定义,来深入 C# 语言中的运算符重载。
C# 运算符重载决策示例
下面的例子定义一个 Complex 类,实现了复数加、减、乘和除的四则运算。C# 中定义常规运算符的语法如下:
[public | private | protected | internal | internal protected] static
下面是 C# 3.0 代码。
struct Complex
...{
public double Real ...{ get; set; }
public double Imaginary ...{ get; set; }
public Complex(double real, double imaginary) : this() ...{ this.Real = real; this.Imaginary = imaginary; }
public static Complex operator +(Complex c1, Complex c2)
...{
return new Complex ...{ Real = c1.Real + c2.Real, Imaginary = c1.Imaginary + c2.Imaginary };
}
public static Complex operator -(Complex c1, Complex c2)
...{
return new Complex ...{ Real = c1.Real - c2.Real, Imaginary = c1.Imaginary - c2.Imaginary };
}
public static Complex operator *(Complex c1, Complex c2)
...{
return new Complex ...{ Real = c1.Real * c2.Real - c1.Imaginary * c2.Imaginary, Imaginary = c1.Real * c2.Imaginary
- c1.Imaginary * c2.Real };
}
public static Complex operator /(Complex c1, Complex c2)
...{
return new Complex ...{ Real = -c1.Real * c2.Real + c1.Imaginary * c2.Imaginary, Imaginary = -c1.Real *
c2.Imaginary + c1.Imaginary * c2.Real };
}
}
由于运算符重载定义在定义它的对象实例上生效,所以可以改写 operator - 和 operator / 运算,使其更加简单。
public static Complex operator -(Complex c1, Complex c2)
...{
return c1 + new Complex ...{ Real = c2.Real, Imaginary = c2.Imaginary };
}
public static Complex operator /(Complex c1, Complex c2)
...{
return c1 * new Complex ...{ Real = -c2.Real, Imaginary = -c2.Imaginary };
}
这样我们就可以很方便的使用 Complex 类:
var c1 = new Complex(3, 4), c2 = new Complex(1, 2);
var c3 = c1 * c2;
Complex c4 = c1 - c2 / c3 + c1;
为了实现更加简单的赋值,我们还需要实现隐式类型转换(从 string 到 Complex)。
public static implicit operator Complex(string value)
...{
value = value.TrimEnd('i');
string[] digits = value.Split('+', '-');
return new Complex ...{ Real = Convert.ToDouble(digits[0]), Imaginary = Convert.ToDouble(digits[1]) };
}
可以通过如下代码对实例进行赋值。
Complex c = "4+5i";
在编译器生成这些运算符重载代码时,实际上会为每个已被重载运算符定义一个特殊名称的方法。如 operator +,其实等同于如下代码:
[SpecialName]
public static Complex op_Addition(Complex c1, Complex c2)
...{
return new Complex ...{ Real = c1.Real + c2.Real, Imaginary = c1.Imaginary + c2.Imaginary };
}
C# 运算符重载一览表
您可以在 C# 中对于以下运算符进行重载决策。
+, -, !, ~, ++, --, true, false
这些一元运算符可被重载。
+, -, *, /, %, &, |, ^, <<, >>
这些二元运算符可被重载。
==, !=, <, >, <=, >=
这些关系运算符可被重载。
&&, ||
这些条件运算符不能被重载,但它们的值被 & 和 | 评估,而这两个运算符可以重载。
[]
数组运算符不能被重载,但您可以定义索引器。
()
转换运算符不能被重载,但您可以定义隐式类型转换和显式类型转换运算符。
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
这些赋值运算符不能被重载,但他们的值,如 +=,会被 + 评估,而 + 可以被重载。
=, ., ?:, ->, new, is, sizeof, typeof
这些运算符不能被重载。
结论
运算符重载是对重载概念的一个重要补充和发展,它针对对象关系中的多元关系和四则运算、关系运算等常规运算提供了重载支持,开发人员可以利用运算符重载优化利用到这些关系的实现代码中,以提高生产力。
华为 C++ 培训资料 华为 C++ 培训资料
部分内容
第一章 类、接口 ………………………………………………………………… 7
1.1 Handle-Body与接口、抽象接口 …………………………………………7
1.2 多继承、与菱形缺陷、this跳转等……………………… ……………… 13
1.3 C++多态的两种多态形式和区别…………………………………………… 18
第二章 重载 ………………………………………………………………………18
2.1 函数重载 ………………………………………………………………………19
2.2 运算符重载 ………………………………………………………………… 20
第三章 模板 ………………………………………………………………………29
3.1 模块函数 ……………………………………………………………………29
3.2 模块类……………………………………………………………………………31
3.3 STL标准模板库…………………………………………………………………34
附录:参考资料 ……………………………………………………………………… 39 运算符重载———运算符重载的基本概念 引入运算符重载的目的:
由于C++预定义的运算符,只能用于基本数据类型的运算:整型、实型、字符型、逻辑型,导致对象无法通过运算符进行运算。故引入了运算符重载。
运算符重载:
1:运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。
2:运算符重载的目的是:扩展C++中提供的运算符的适用范围,使之能作用于对象。
3:运算符重载的实质是函数重载,可以重载为普通函数,也可以重载为成员函数
4:把含运算符的表达式转换成对运算符函数的调用。 c++为什么要进行运算符重载? 运算符重载是为了解决类对象之间的运算的,通常的运算符只用于算术运算,如常量int之间,因为编译器已经定义了;而一个类两个对象之间成员进行运算必须重新定义,让编译器在遇到对象运算时能按我们要求的进行运算,这就是运算符重载的意义,即重定义运算符,因此你可以看到,运算符重载就是为类对象服务的,那么两个对象的成员进行运算那必须先获得对象本身啦,所以运算符重载参数必须含有类指针或引用,这是主要... C++运算符重载详解 为什么要对运算符进行重载:
C++预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。
C++运算符重载的实质:
运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的C++多态。目的在于让人能够用同名的函 什么是运算符重载? 如何在 C++ 中进行运算符重载?运算符重载在面向对象编程中的好处是什么? 当使用自定义的数据类型时,如果可以使用熟悉的运算符来进行操作,代码会更接近自然语言的表达,从而提高可读性。例如,对于一个自定义的字符串类,如果重载了“+”运算符来实现字符串拼接,用户就可以像处理内置字符串类型一样方便地操作自定义字符串。当需要对自定义类型的操作进行修改时,如果使用运算符重载,只需要在重载的运算符函数中进行修改,而不需要在多个不同的函数调用处进行修改。运算符重载是 C++ 的一项强大特性,它允许程序员为已有的运算符赋予新的含义,使其能够作用于用户自定义的数据类型。一、运算符重载的概念。
C#
111,077
社区成员
642,570
社区内容
发帖 与我相关 我的任务 C# .NET技术 C# 复制链接
扫一扫 分享 确定 社区描述 .NET技术 C# 社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章