首页 > 其他分享 >重载操作符

重载操作符

时间:2023-06-01 20:46:06浏览次数:48  
标签:int 运算符 Complex 操作符 重载 Edge other

重载操作符

重载操作符Operator overloading是C++中一种特殊的语法,允许我们自定义一些运算符的行为,使它们能够用于自定义的数据类型。

例如,我们可以自定义一个加法运算符,使它能够直接对两个自定义类型的对象进行相加,而不需要额外的函数调用。这样可以使代码更加简洁、易读,并且提高了可重用性。

C++中可以重载的运算符包括算术运算符关系运算符逻辑运算符位运算符等等。需要注意的是,不能重载的运算符有:

作用域运算符 ::、成员访问运算符 .->、三目运算符 ?:、sizeof运算符和类型转换运算符 typeid

重载运算符的方法是在类中定义一个与运算符同名的函数,并在函数前加上关键字 operator,这样就可以对该运算符进行重载。


例如

重载加法运算符的示例代码:

  • 定义
class Complex {
public:
    double real, imag;
    Complex operator+ (const Complex& other) const {
        Complex res;
        res.real = real + other.real;
        res.imag = imag + other.imag;
        return res;
    }
};
  • 主函数
int main() {
    Complex c1 {1.0, 2.0};
    Complex c2 {3.0, 4.0};
    Complex c3 = c1 + c2;
    cout << c3.real << " " << c3.imag << endl;

    return 0;
}
  • 在这个示例中,我们定义了一个Complex类,其中包含两个成员变量realimag,表示实部虚部。然后我们通过重载加法运算符,使得Complex类型的对象可以直接相加,而不需要额外的函数调用。
  • 这里创建了两个复数对象c1c2,并将它们相加得到一个新的复数c3,然后输出c3的实部和虚部。

输出结果为:

4 6

再比如:

我们可以定义一个结构体类型表示这两个复数在复平面内的坐标,并重载加法运算符,使得我们可以直接对两个虚数进行相加。

示例代码:

  • 定义结构体
struct Complex {
    double x, y;
    Complex operator+ (const Complex& other) const {
        return Complex {x + other.x, y + other.y};
    }
};
  • 主函数
int main() {
    Complex c1 {1.0, 2.0};
    Complex c2 {3.0, 4.0};
    Complex c3 = c1 + c2;
    cout << c3.x << " " << c3.y << endl;
    return 0;
}

在主函数中,我们定义了两个虚数v1v2,并将它们相加得到一个新的虚数v3。然后输出v3的分量xy

输出结果为:

4 6

当然

如果你是从这篇博客来的,那你应该希望了解这个:

  • 定义结构体
struct Edge{
    int u, v, w;
    bool operator<(const Edge &other) const{
        return w < other.w;
    }
}e[maxn];
  • 主函数
int main(){
    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= m; i++){
        cin >> e[i].u >> e[i].v >> e[i].w;
    }

    sort(e + 1, e + m + 1);

很显然了, 在这里我们重载了小于号运算符,使得Edge类型的对象可以进行比较,并且满足严格弱序关系,所以可以使用sort函数Edge类型的对象进行排序,基本上与另外写一个cmp函数没有什么区别,但就是很有逼格所以,原代码改为这样,效果是一样的:

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 5;
int fa[maxn];

struct Edge{
    int u, v, w;
}e[maxn];

int find(int x){
    return x == fa[x] ? x : fa[x] = find(fa[x]);
}

//-------------------------------------------------------
bool cmp(Edge x, Edge y){
    return x.w < y.w;
}
//-------------------------------------------------------

int main(){
    int n, m;
    cin >> n >> m;

    for (int i = 1; i <= m; i++){
        cin >> e[i].u >> e[i].v >> e[i].w;
    }

//-------------------------------------------------------
    sort(e + 1, e + m + 1, cmp);
//-------------------------------------------------------

    for (int i = 1; i <= n; i++){
        fa[i] = i;
    }

    int ans = 0, cnt = 0;
    for (int i = 1; i <= m; i++){
        int fu = find(e[i].u), fv = find(e[i].v);
        if (fu != fv){
            fa[fu] = fv;
            ans += e[i].w;
            cnt++;
        }
        if (cnt == n - 1){
            break;
        }
    }

    cout << ans << endl;

    return 0;
}

  • 需要注意的是,重载运算符时,必须保证操作数中至少有一个是用户自定义的类型,否则编译器无法识别。此外,重载的运算符必须具有合理的语义,不能与原有的语义相悖。

标签:int,运算符,Complex,操作符,重载,Edge,other
From: https://www.cnblogs.com/EraYes/p/17450165.html

相关文章

  • 2.5. 重载与覆盖
    在Java中,方法的重载(Overloading)和覆盖(Overriding)是两个重要的概念。它们都涉及到方法的定义与使用,但作用和规则有所不同。重载(Overloading)重载是指在同一个类中定义多个同名的方法,但它们的参数列表不同(参数的个数、类型或顺序不同)。重载允许我们使用相同的方法名来实现不同的......
  • Problem A: 整型数组运算符重载
    HomeWebBoardProblemSetStandingStatusStatisticsProblemA:整型数组运算符重载TimeLimit:1Sec  MemoryLimit:128MBSubmit:1458  Solved:954[Submit][Status][WebBoard]Description定义Array类:1.拥有数据成员intlength和int*mems,分别是数......
  • 方法重载
    packagecom.karl2;publicclassMethoOverDemo{publicstaticvoidmain(String[]args){//方法重载kokoko();sasasa(100);fire();fire("米国");fire("米国",999);}publicstaticvoi......
  • nginx windows下重载配置失败
    正常操作命令是:cdC:\ProgramFiles\nginx&&nginx-sreload。但是把nginx安装为windows服务运行后,再执行重载就不好使了。会报错:nginx:[error]OpenEvent("Global\ngx_reload_4460")failed(5:Accessisdenied),即便是用管理员运行cmd权限也不够。 【解决办法】1.下载......
  • Python 函数重载
    函数重载是指可以使用相同的函数名,但是函数参数类型和/或数量不同的多个函数。Python不支持函数重载,因为Python是一种动态类型语言,函数参数类型不需要在代码中声明,并且Python中的函数参数数量也可以是可变的。这意味着在同一个作用域内定义两个或两个以上具有相同名称但参数......
  • Problem C: 重载字符的加减法
    HomeWebBoardProblemSetStandingStatusStatisticsProblemC:重载字符的加减法TimeLimit:1Sec  MemoryLimit:128MBSubmit:1895  Solved:1155[Submit][Status][WebBoard]Description定义一个字符类Character,只有一个char类型的数据成员。重载......
  • 方法的重载、构造器,封装、静态非静态方法
    静态非静态方法如果两个都是静态方法可以直接互相调用,否则无法调用非静态(无static关键字)方法如果方法为非静态,调用时无法直接用student.get();要先实例化一个对象在用.方法方法的重载多个方法可以重名,调用时会自动重载,检查方法名以及对应的参数判断具体使用的是哪一个方法......
  • C语言操作符详解
    第五节操作符一、 操作符操作符分为以下几种操作符:1、算数操作符+、-、*、/、%。%操作符的两个操作数必须都得是整数,如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。当想计算出一个浮点数结果的时候,就是3/2想计算出1.5的话,就需要让3.0/2或3/2.0。2、......
  • C++ | 运算符重载
    1.运算符重载1.1基本概念函数重载(函数多态)是指用户能够定义多个名称相同但参数列表不同的函数,旨在使用户能够用同名的函数来完成相同的基本操作,即使这种操作被用于不同的数据类型。运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。实际上,很多C++(也包括C语......
  • 分数重载
    #include<iostream>usingnamespacestd;classFS{private:intfz;intfm;public:FS(){fm=1;fz=0;}voidset(intm,intz){fm=m;fz=z;}......