首页 > 编程语言 >C# 重载运算符

C# 重载运算符

时间:2024-08-18 16:53:27浏览次数:15  
标签:p2 p1 Point C# 运算符 重载 public

目录

简介

 语法

使用规则

示例

使用场景


简介

什么是重载运算符

利用现有的某种运算符,针对自定义类或者结构,来定义某种运算操作。

为什么需要重载运算符

利用现有的运算符,简化自定义类型的操作。最好是,该运算符和该操作符,具有一定的相关性。

可以重载的运算符不可以重载的运算符
+ 加法= 赋值运算符
- 减法(一元和二元)?: 条件运算符(三元运算符)
* 乘法:: 作用域解析运算符
/ 除法new 对象实例化运算符
% 取模is 类型检查运算符
& 位与as 类型转换运算符
^ 位异或sizeof 大小运算符
|| 逻辑或checked unchecked 检查上下文运算符
&& 逻辑与delegate 委托运算符
== 等于    != 不等于stackalloc 栈分配运算符
<< 左移位
>> 右移位

 语法

public static 返回值 operator重载运算符()

{

}

使用规则

  1. 运算符重载的声明: 运算符重载必须在自定义类型(类或结构体)中声明,并且必须是 publicpublic static 的方法。每个运算符重载方法必须使用 operator 关键字声明。

  2. 运算符重载的方法签名: 每个运算符重载方法必须使用特定的签名。例如,+ 运算符的重载方法必须接受两个参数并返回一个值。

  3. 对称性: 如果你重载了 + 运算符,那么你也应该重载 -* 和其他相关的运算符,以保持操作的一致性。

  4. 运算符的限制: 不是所有运算符都可以重载。例如,.(成员访问运算符)和 ::(范围解析运算符)无法重载。

示例

using System;

public class Point
{
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }

    // 重载 + 运算符
    public static Point operator +(Point p1, Point p2)
    {
        return new Point(p1.X + p2.X, p1.Y + p2.Y);
    }

    // 重载 - 运算符
    public static Point operator -(Point p1, Point p2)
    {
        return new Point(p1.X - p2.X, p1.Y - p2.Y);
    }

    // 重写 ToString 方法以便于输出 Point 对象
    public override string ToString()
    {
        return $"({X}, {Y})";
    }
}

public class Program
{
    public static void Main()
    {
        Point p1 = new Point(3, 4);
        Point p2 = new Point(1, 2);

        // 使用重载的 + 运算符
        Point sum = p1 + p2;
        Console.WriteLine($"Sum: {sum}"); // 输出: Sum: (4, 6)

        // 使用重载的 - 运算符
        Point difference = p1 - p2;
        Console.WriteLine($"Difference: {difference}"); // 输出: Difference: (2, 2)
        Console.ReadKey();
    }
}

使用场景

  • 数学运算:自定义数学类,如复数、矩阵等,可以通过运算符重载实现直观的数学运算。
  • 比较操作:自定义比较类型(如自定义的时间、货币类型)可以通过运算符重载实现直观的比较操作。
  • 集合操作:自定义集合类(如自定义的集合类型)可以通过运算符重载实现集合操作,如并集、交集等

标签:p2,p1,Point,C#,运算符,重载,public
From: https://blog.csdn.net/m0_74995879/article/details/141301598

相关文章

  • 【重学c++primer】第五章第二节 深入浅出:左值和右值
    文章目录左值右值传统的左值和右值划分glvalueprvaluexvalue总结左值和右值的转换左值转右值decltype左值右值传统的左值和右值划分左值:英文为leftvalue,简写lvalue右值:英文为rightvalue,简写rvalue一个左一个右,这个左右的判定是针对什么呢?实际上是针对等......
  • 026、Vue3+TypeScript基础,使用async和await来异步读取axios的网络图片
    01、App.vue代码如下:<template><divclass="app"><h2>App.Vue</h2><Person/></div></template><scriptlang="ts"setupname="App">//JS或TSimportPersonfrom'./......
  • JDBC链接MySQL day18
    packagecom.shujia.day18.ketang;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;/*我们要想操作mysql数据库,jdk本身是无法操作的,因为java并不知道将来开发者需要使用java连接什么样的数据库,所以j......
  • Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.s
    环境:JDK21问题原因是Lombok,与JDK21兼容的最低Lombok版本是1.18.30,最小的SpringBoot版本是3.1.4。解决:将lombook版本改为1.18.30<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lomb......
  • OpenCV(logPolar()、Point2f())
    目录1.cv::logPolar()函数原型:参数说明:用途和示例:2.cv::Point2f类定义:属性:主要构造函数:用途和示例:总结:1.cv::logPolar()cv::logPolar()是OpenCV中用于进行对数极坐标变换(Log-PolarTransformation)的函数。对数极坐标变换将图像的空间坐标转换为极坐标,并对径向分量取对数......
  • C++实现计算器(菜鸡版*2)
    我写了两种,都是支持小数的(默认从左到右,请自行解括号)别喷我这个很菜,还要用户自己解括号。大部分计算器不都这样吗(包括Windows自带的),而且我还编了一个可以直观的看到公式的。话虽如此,但我还是会努力编出更好用的计算器的喜欢就收藏一下吧第一种:数字/运算符一个一个输入代码:......
  • C++判断素数模板
    首先是朴素方法代码:#include<bits/stdc++.h>usingnamespacestd;intnum;boolcheck(intnum){if(num<2){returnfalse;}for(inti=2;i<=sqrt(num);i++){if(num%i==0){returnfalse;}}returntr......
  • 题解:CF1630F Making It Bipartite
    题意图上有\(n\)个点,且具有点权,点权保证互不相同,若两个点点权有倍数关系,则两点之间有一边,问你最少删去多少个点能使图变为二分图。思路因为如果\(a\)是\(c\)的倍数且\(c\)是\(b\)的个数,所以\(a\)是\(c\)的倍数。由此可以看出,若\(a\)与\(b\)相连且\(b\)与......
  • CSP-J/S2023游记
    过了将近一年才回来补游记比赛前Day-22光速报名Day-21~0国庆假期+痛苦的whkDay1CSP-J早上乘出租车风驰电掣赶到连大,在门口等半天发现已经可以进去了。一路踩着爆浆的银杏到了日新楼门口,看到由无数人头组成的一片乌云,以及一辆挂着横幅的黄色校车。CL排场挺大进了考场,......
  • 题解:CF1034B Little C Loves 3 II
    思路看到这道题时,第一思路就是网络流,结果一看数据\(10^{9}\)直接转向找规律。主要思路:神秘特判。首先,下面的结论基于\(n\lem\)。Case1.当\(n=1\)时,易得的是我们可以以\(6\)为循环节构造。Case2.当\(n=2\)时,我们可以构造出\(4a,5a,6a\)的形式。易得,通过裴蜀......