c++运算符重载

#include <iostream>
#include <string>

using namespace std;

class A
{
    //使用友元函数实现运算符重载,要在形参中指出所有参数,并且注意返回值的类型一边不用引用了
    friend A operator - (const A &a, const A &b);
    //如果是这种写法:friend A& operator - (const A &a, const A &b);
    //由于两个const的对象不能当作返回值,并且如果在函数中写了个保存结果的临时变量,这个临时变量又会在函数结束时销毁
    //导致返回不正确,有如果你在函数中new了一个对象,或者malloc了一个对象,但是这个对象你又要记得销毁,这又是常常容易忘记的
    //综上只要是使用友元函数实现的运算符重载,那么就返回一个对象,不用引用。
    //只要是在函数内部实现的运算符重载,那么就返回引用对象,一般是返回*this
public:
    string name;
    int id;
    A()
    {
        this->name = "hello";
        this->id = 0;
    }
    //在函数中实现运算符重载,会默认将this当作一个变量
    A& operator = (const A &a)
    {
        this->name = a.name;
        this->id = a.id;
        return *this;
    }
    A& operator + (const A &a)
    {
        this->id+a.id;
        return *this;
    }
};

A operator-(const A &a, const A &b) {
    A t;
    t.id = a.id-b.id;
    return t;
}


A func()
{
    A a;
    a.name = "shadaoi";
    a.id = 123;
    return a;
}

int main()
{
    A b;
    cout<<b.name<<endl;
    cout<<b.id<<endl;
    b = func();
    cout<<b.name<<endl;
    cout<<b.id<<endl;
    return 0;
}

比较运算符重载:

参考博客:https://blog.csdn.net/qq_36583051/article/details/122185372

不写友元函数的话有可能会出现下面这种报错:

ERROR:C2678 二进制“<”: 没有找到接受“const _Ty”类型的左操作数的运算符(或没有可接受的转换)

错误代码:

#include <map>
#include <string>

struct Section
{
    int id;
    std::string code;

    bool operator<(const Section& rhs)
    {
        return id < rhs.id;
    }
};

int main()
{
    std::map<Section, std::string> stdMap;
    stdMap.insert(std::make_pair(Section{ 1 }, "kaizen1"));
    stdMap.insert(std::make_pair(Section{ 2 }, "kaizen2"));
    stdMap.insert(std::make_pair(Section{ 3 }, "kaizen3"));

    return 0;
}

错误原因:

由于调用了这种需要调用比较运算的STL (Standard Template Library的缩写,中文译为“标准模板库)

编译器限定,运算符“<”内部只需读取对象成员变量,体现出大小比较的原则即可,禁止对成员变量进行修改。

所以,重载运算符“<”的实现必须要求const限定。

如果你仅仅声明stdMap,而不去insert他也不会报错。

正确写法:

#include <map>
#include <string>

struct Section
{
    int id;
    std::string code;

#if 1
    // 方案一:重载运算符<
    bool operator<(const Section & rhs) const   // 注意:第二个const
    {
        return id < rhs.id;
    }
#else
    // 方案二:提供运算符<的友元函数
    friend bool operator<(Section const& lhs, Section const& rhs)
    {
        return lhs.id < rhs.id;
    }
#endif
};

int main()
{
    std::map<Section, std::string> stdMap;
    stdMap.insert(std::make_pair(Section{ 1 }, "kaizen1"));
    stdMap.insert(std::make_pair(Section{ 2 }, "kaizen2"));
    stdMap.insert(std::make_pair(Section{ 3 }, "kaizen3"));

    return 0;
}
文章目录