1.c++重载运算符
1.1 基本规则
- 语法:使用关键字
operator
来重载运算符,例如 operator+
、operator==
。 - 形式:
- 成员函数重载:运算符是类的成员函数,左操作数必须是该类的对象。
- 全局函数重载:运算符是全局函数,通常需要友元声明以访问类的私有成员。
- 限制:
- 不能重载
::
(域运算符)、.*
(成员指针选择运算符)、sizeof
和 typeid
。 - 某些运算符需要成对重载,例如
==
和 !=
。
1.2 C++ 支持以下运算符的重载:
- 算术运算符:
+
, -
, *
, /
, %
- 比较运算符:
==
, !=
, <
, >
, <=
, >=
- 位运算符:
&
, |
, ^
, ~
, <<
, >>
- 逻辑运算符:
&&
, ||
, !
- 一元运算符:
+
, -
, ++
, --
- 其他:
=
, []
, ()
, ->
- 输入/输出:
<<
, >>
1.3 简单案例:
#include <iostream>
#include <cstring>
class MyString {
private:
char* str;
public:
MyString(const char* s = "") {
str = new char[strlen(s) + 1];
strcpy(str, s);
}
// 自定义赋值运算符
MyString& operator=(const MyString& other) {
if (this == &other) return *this; // 防止自赋值
delete[] str; // 释放旧内存
str = new char[strlen(other.str) + 1];
strcpy(str, other.str);
return *this;
}
void display() const {
std::cout << str << std::endl;
}
~MyString() {
delete[] str;
}
};
int main() {
MyString s1("Hello"), s2;
s2 = s1; // 使用重载的赋值运算符
s2.display(); // 输出: Hello
return 0;
}
2.c# 重载运算符
2.1 基本规则
- 只能重载已有的运算符,不能创建新的运算符。
- 重载的方法必须是
public static
。 - 某些运算符必须成对重载(例如:
==
和 !=
,<
和 >
)。 - 通常用于值对象(如数学对象、坐标、向量等)。
2.2 C# 支持重载的运算符包括:
- 算术运算符:
+
, -
, *
, /
, %
- 比较运算符:
==
, !=
, <
, >
, <=
, >=
- 位运算符:
&
, |
, ^
, ~
, <<
, >>
- 逻辑运算符:
&&
, ||
- 一元运算符:
+
, -
, !
, ~
, ++
, --
- 转换运算符:
true
, false
2.3 简单案例:
using System;
public struct Point
{
public int X { get; }
public int Y { get; }
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);
}
// 重载 ToString() 方法便于显示
public override string ToString()
{
return $"({X}, {Y})";
}
}
class Program
{
static void Main()
{
Point p1 = new Point(3, 4);
Point p2 = new Point(1, 2);
Point result = p1 + p2;
Console.WriteLine(result); // 输出: (4, 6)
}
}